QPaintEvent, installEventFilter, QPainter, Overpainting |
Здравствуйте, гость ( Вход | Регистрация )
QPaintEvent, installEventFilter, QPainter, Overpainting |
SABROG |
26.5.2009, 18:25
Сообщение
#21
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Накатал простенький пример. Правда не самый удачный, т.к. не показывает преимущества технологии. Отличить от обычного paintEvent'a не получится, но тем не менее шрифт, который обычно рисуется на фоне - рисуется поверх вводимого текста.
Сообщение отредактировал SABROG - 26.5.2009, 18:26
Прикрепленные файлы
|
|
|
SABROG |
26.5.2009, 19:22
Сообщение
#22
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Господа, поздравьте меня. Наконец-то я это сделал:
|
|
|
DmP |
26.5.2009, 19:47
Сообщение
#23
|
Студент Группа: Участник Сообщений: 61 Регистрация: 11.3.2008 Пользователь №: 116 Спасибо сказали: 15 раз(а) Репутация: 2 |
SABROG, сорри за офтоп, но чем делаются такие картинки?
|
|
|
SABROG |
26.5.2009, 20:34
Сообщение
#24
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
SABROG, сорри за офтоп, но чем делаются такие картинки? Camtasia Studio. Несколько мимо темы, такой код: Цитата(SABROG @ 26.5.2009, 15:52) * QPaintEvent *pe = (QPaintEvent *)e; QWidget *w = (QWidget *)o; стиль приведения не С++ный, а Сишный, и уж точно не принятый в Qt (qobject_cast<>, надобы) Грешу понемногу, хочется как обычно сделать быстро, а вспоминать является ли QEvent - QObject'ом влом (и кстати, не является, т.ч. static_cast, но я в этих cast'ах плаваю, т.ч. это мне бы еще пришлось блог Алёны открывать ). Сообщение отредактировал SABROG - 26.5.2009, 21:24 |
|
|
igor_bogomolov |
26.5.2009, 22:09
Сообщение
#25
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Может я что то делаю не так, но нарисовать что то приемлемое у меня не получается. Не подскажешь как координаты привести к единым. Т.е. как провести прямую линию через несколько виджетов, и она при этом не ломалась.
Раскрывающийся текст
|
|
|
SABROG |
26.5.2009, 22:28
Сообщение
#26
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Я об этом думал и хотел попробовать завтра такую штуку (исходники на работе остались):
- даем знать в eventFilter какое окно у нас главное и вместо flag используем указатель на главное окно (QObject/QWidget) - делаем repaint для главного окна - если QEvent::Paint приходит для главного окна, то сбрасываем переменную-флаг где содержится указатель на главное окно в 0 таким образом, чтобы следующая проверка вызывала оригинальный обработчик (QObject::eventFilter(o, e); - вызываем QApplication::sendEvent() - т.к. у нас переменная 0, то должна произойти отрисовка всех дочерних окон - после возврата из sendEvent рисуем на главном окне |
|
|
igor_bogomolov |
26.5.2009, 22:40
Сообщение
#27
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
|
|
|
kwisp |
27.5.2009, 7:23
Сообщение
#28
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
igor_bogomolov,
на каждом виджете в отдельности получилось нарисавать, почему бы просто не рассчитать где должна находится линия на каждом виджете чтоб при совмещении получилась одна прямая.. хотя может криво получится |
|
|
SABROG |
27.5.2009, 8:51
Сообщение
#29
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Так ведь ничего не нарисуется. Точнее, линия так и останется под другими виджетами. Иначе в своем коде, который я привел чуть выше, я бы уже получил нормальную прямую линию. Или я чего то не допонял??? Пока есть такое предположение. Т.к. ты установил фильтры на каждый компонент, то событий приходит 3-4. В каждом таком событии ты вызываешь оригинальный обработчик для каждого из фильтрованных виджетов. В результате не получается цепочки типа Родитель->Ребенок1->Ребенок2. А получается несколько отдельных вызовов, которые не связаны: Родитель-Оригинальный обработчик-Свой обработчик Ребенок1-Оригинальный обработчик-Свой обработчик Ребенок2-Оригинальный обработчик-Свой обработчик По идее, если установить фильтр только на главное окно и через sendEvent отправить событие отрисовки, то все дети должны перерисоваться сами и после того как они это сделают управление вернется обратно в фильтр событий, где мы и отрисуем то, что нам надо поверх всего этого. Но как я сказал это пока предположение, проверить я смогу на работе. |
|
|
igor_bogomolov |
27.5.2009, 8:52
Сообщение
#30
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
на каждом виджете в отдельности получилось нарисавать, почему бы просто не рассчитать где должна находится линия на каждом виджете чтоб при совмещении получилась одна прямая.. Не подскажешь как координаты привести к единым. Т.е. как провести прямую линию через несколько виджетов, и она при этом не ломалась. Как раз это у меня не получается. Не знаю, как координаты привести. Это единственный выход в нашей ситуации. Если заменить p.setViewport(rect()) на p.setWindow(qobject_cast<QWidget*>(obj)->geometry()), линии практически совпадают. Тут проблемы возникают с методом geometry, возвращает неправильные координаты и размеры. |
|
|
Текстовая версия | Сейчас: 17.11.2024, 23:15 |