QPaintEvent, installEventFilter, QPainter, Overpainting |
Здравствуйте, гость ( Вход | Регистрация )
QPaintEvent, installEventFilter, QPainter, Overpainting |
kwisp |
27.5.2009, 9:01
Сообщение
#31
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
|
|
|
igor_bogomolov |
27.5.2009, 9:32
Сообщение
#32
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
если установить фильтр только на главное окно Тогда, в eventFilter(QObject *obj, QEvent *event) obj == главное окно, например QDialogДалее через sendEvent отправить событие отрисовки QApplication::sendEvent(obj, event); т.е. ты отрисуешь только сам QDialog. Никаких child-ов здесь отрисовано не будет!!!!!правление вернется обратно в фильтр событий Здесь мы отрисуюем то что мы хотим, только по QDialog.Теперь когда мы выйдем из евентфильтра, поверх QDialog нарисуются child-ы, затерев собой то что мы рисовали. Другимим словами, предложенный тобой способ, позволяет нарисовать оригинальный виджет, для которого установлен фильтр, + что-то поверх него. Если ты попытаешься в обработчике события главного окна, принудительно выздать обработчик события его потомков, в лучшем случае получишь ошибку QPainter-а, иначе просто крашь. kwisp, если интересно, возьми мой тестовый проект. Может у тебя получится нормально координаты привести. kwisp, Если соберешь проект, увидешь, что через кнопку линия рисуется правильно. Для QTextEdit метод geometry почему то возвращает неправильные координыты? Как с этим бороться?
Прикрепленные файлы
|
|
|
kwisp |
27.5.2009, 10:20
Сообщение
#33
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
igor_bogomolov,
готово проблема в viewport() он возвращает не совсем точную геометрию текседита. я так написал криво извини я всетаки на работе думаю понятно Раскрывающийся текст
|
|
|
igor_bogomolov |
27.5.2009, 10:32
Сообщение
#34
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
kwisp, все правильно. Сам только что до этого додумался. Дело в том что viewport возвращем координаты относительно QTextEdit.
Блин, как все усложняется, относительно составных виджетов. Через QCalendarWidget, вообще непонятно как линию провести. Но уже почти. Немного осталось додумать. Нужен универсальный способ получить координаты любого виджета, относительно главного окна. Сообщение отредактировал igor_bogomolov - 27.5.2009, 10:35 |
|
|
Kagami |
27.5.2009, 10:47
Сообщение
#35
|
Старейший участник Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: 9 |
Можно подумать в эту сторону
Раскрывающийся текст Цитата QPoint QWidget::mapTo ( QWidget * parent, const QPoint & pos ) const Translates the widget coordinate pos to the coordinate system of parent. The parent must not be 0 and must be a parent of the calling widget. See also mapFrom(), mapToParent(), mapToGlobal(), and underMouse(). QPoint QWidget::mapToGlobal ( const QPoint & pos ) const Translates the widget coordinate pos to global screen coordinates. For example, mapToGlobal(QPoint(0,0)) would give the global coordinates of the top-left pixel of the widget. See also mapFromGlobal(), mapTo(), and mapToParent(). QPoint QWidget::mapToParent ( const QPoint & pos ) const Translates the widget coordinate pos to a coordinate in the parent widget. Same as mapToGlobal() if the widget has no parent. See also mapFromParent(), mapTo(), mapToGlobal(), and underMouse(). |
|
|
igor_bogomolov |
27.5.2009, 11:06
Сообщение
#36
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Можно подумать в эту сторону Надо посмотреть.Пока решил так. Работает на ура. Раскрывающийся текст
|
|
|
igor_bogomolov |
27.5.2009, 11:54
Сообщение
#37
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
|
|
|
SABROG |
27.5.2009, 12:30
Сообщение
#38
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
В общем затык на отрисовке чайлдов. Как я понял схема такая repaint()->repaint_sys()->QWidgetPrivate::drawWidget(и тут рекурсия этого drawWidget на всех чайлдах). Но похоже я что-то упускаю, как-то надо QPainter инициализировать чтоль, но это уже похоже надо лезть в трусы к QWidgetPrivate членам.
Насчет всех чайлдов. Я такую функцию написал:
Юзать так:
P.S.: теперь вариант с прозрачным QWidget'ом поверх всех окон мне кажется не таким уж и плохим вариантом. Но я еще не сдался Сообщение отредактировал SABROG - 27.5.2009, 12:38 |
|
|
igor_bogomolov |
27.5.2009, 12:59
Сообщение
#39
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
В общем затык на отрисовке чайлдов. Как я понял схема такая repaint()->repaint_sys()->QWidgetPrivate::drawWidget(и тут рекурсия этого drawWidget на всех чайлдах). Но похоже я что-то упускаю, как-то надо QPainter инициализировать чтоль, но это уже похоже надо лезть в трусы к QWidgetPrivate членам. Ничего не понял, если честно. Но с трусами и членами силно завернул.childsRecursive заюзал. Все работает. Удобно. Так я что-то и не понял, что тебя не устраивает??? Задачу решили, на мой взглян, хорошо. Работает и рисует как надо. |
|
|
SABROG |
27.5.2009, 13:19
Сообщение
#40
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
В общем затык на отрисовке чайлдов. Как я понял схема такая repaint()->repaint_sys()->QWidgetPrivate::drawWidget(и тут рекурсия этого drawWidget на всех чайлдах). Но похоже я что-то упускаю, как-то надо QPainter инициализировать чтоль, но это уже похоже надо лезть в трусы к QWidgetPrivate членам. Ничего не понял, если честно. Но с трусами и членами силно завернул.childsRecursive заюзал. Все работает. Удобно. Так я что-то и не понял, что тебя не устраивает??? Задачу решили, на мой взглян, хорошо. Работает и рисует как надо. Оверхед сплошной Тут такая ситуация вырисовывается: в порядке рекурсии испускаются QPaintEvent'ы начиная от родителя до последнего самого глубокого ребенка (это если они вообще видимы, конечно). Мне надо как-то сделать так, чтобы обойти стандартный механизм рекурсии и отрисовать только одно окно не вызывая при этом перерисовку (генерацию эвентов перерисовки) для дочерних окон. Наткнулся на любопытный код:
По сути тоже самое, что и grabWidget(). Но тут отличие в том, что сгенеренный эвент срабатывает и окно (без детей) рисуется в файл. Если вместо &pix редиректнуть на другой виджет, то уже не пашет. |
|
|
Текстовая версия | Сейчас: 29.11.2024, 7:09 |