![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
piton |
![]()
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 29.9.2009 Пользователь №: 1125 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Предисловие: есть движок, в котором реализованы мультимедиа объекты (картинки, видео, текст и т.д.) и их управление (загрузка, отрисовка, размещение на окне). Все объекты выводятся на окно в зависимости от их глубины (depth) размещения, т.е. объекты могут друг на друга наезжать и частично или полностью перекрывать друг друга. Все это дело должно работать как под виндой, так и под линуксами. Было принято решение использовать QT в качестве реализации главного окна и обработки мышиных и клавиатурных сообщений.
Сама суть: нужен ввод с клавиатуры в текстовое поле. В качестве эксперимента был взят класс QTextEdit. В принципе в нем все устраивает, за исключением одного момента: это отрисовка в буфер. Снять копию с виджета и поместить ее в тот же QImage не составляет труда, но нельзя запретить виджету рисоваться куда ему захочется. Под виндой это решалось просто, путем сабклассинга и подсовывание своего контекста рисования. В QT я не нашел способа подсунуть свой контекст для отрисовки. QT настырно продолжает рисовать на свой контекст. Пробовал переопределять функции, связанные с рисованием, но в QT они носят чисто информационный характер, т.е. как состоявшийся факт "я отрисовалась и если хочешь, можешь ты еще чего поверх нарисовать". Цель состоит в том, что бы можно было поле для ввода текста использовать от QT и при этом рисовать самому, перемешивая с другими объектами. Вопрос: возможно ли запретить виджету рисоваться куда ему захочется или дать виджету свой контекст для рисования и он сам туда рисовался, при этом не использовал контекст рисования родительского окна (фактически единственного окна)? |
|
|
![]() |
piton |
![]()
Сообщение
#11
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 29.9.2009 Пользователь №: 1125 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(BRE @ 29.9.2009, 18:05) Link Думаю стоит смотреть в сторону QPaintEngine, и делать своего наследника... Я так и не смог найти какого-либо примера или информации как это можно сделать. Хвостов у виджета в сторону QPaintEngine тоже не обнаружил. ![]() Если есть какие либо мысли, с удовольствие выслушаю. Цитата(BRE @ 29.9.2009, 18:05) Link Думаю стоит смотреть в сторону QPaintEngine, и делать своего наследника... Я так и не смог найти какого-либо примера или информации как это можно сделать. Хвостов у виджета в сторону QPaintEngine тоже не обнаружил. ![]() Если есть какие либо мысли, с удовольствие выслушаю. |
|
|
BRE |
![]()
Сообщение
#12
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(piton @ 29.9.2009, 18:08) Link Я так и не смог найти какого-либо примера или информации как это можно сделать. Хвостов у виджета в сторону QPaintEngine тоже не обнаружил. ![]() Если есть какие либо мысли, с удовольствие выслушаю. Мысль следующая.... Любой виджет это QPaintDevice, в начале рисования он создает QPainter, которому указывает себя в качестве поверхности для рисования. Этот вызов идет в QPaintEngine::begin( QPaintDevice * pdev ). Это виртуальный метод, если его переопределить, то можно попробовать использовать вместо pdev свое устройство отображения. Это только мысли. Сообщение отредактировал BRE - 29.9.2009, 18:13 |
|
|
rnd |
![]()
Сообщение
#13
|
Студент ![]() Группа: Участник Сообщений: 54 Регистрация: 22.7.2009 Пользователь №: 930 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Самое просто в таких случаях - смотреть исходники куте и дебажится
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#14
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
piton, тут меня одна мыслишка посетила. Значится баловался я QWebClient'ом, Link.
Смысл его простой, вместо корневого виджета в своей программе, например, QWidget, устанавливаешь QWebClient. Компилируешь и запускашь. Открываешь браузер и вводишь адрес: Link и видешь в браузере свою программу (и она работает). Link Суть мысли: я заметил, что работает это так: запускашь свою программу, появляется её окно, но как только ты в браузере обращаешся к ней. Окно обычное исчезает. Стало бвть рисование проболжается не на окошке. Может там почерпнёшь, чтони-будь интересное? |
|
|
BRE |
![]()
Сообщение
#15
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
2 piton
Перечитал первый пост темы и у меня возник вопрос, а почему для всего этого не использовать QGraphicsView+QGraphicsScene. Эта связка и обеспечивает необходимый функционал. Глубина элементов есть, виджет на сцену поместить можно. |
|
|
piton |
![]()
Сообщение
#16
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 29.9.2009 Пользователь №: 1125 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(rnd @ 29.9.2009, 18:33) Link Самое просто в таких случаях - смотреть исходники куте и дебажится Дебажили, откуда и поняли, что QT рисует на главное окно само. Цитата(Litkevich Yuriy @ 29.9.2009, 18:59) Link piton, тут меня одна мыслишка посетила. Значится баловался я QWebClient'ом, Link. Смысл его простой, вместо корневого виджета в своей программе, например, QWidget, устанавливаешь QWebClient. Компилируешь и запускашь. Открываешь браузер и вводишь адрес: Link и видешь в браузере свою программу (и она работает). Link Суть мысли: я заметил, что работает это так: запускашь свою программу, появляется её окно, но как только ты в браузере обращаешся к ней. Окно обычное исчезает. Стало бвть рисование проболжается не на окошке. Может там почерпнёшь, чтони-будь интересное? Сейчас почитаем, потом отпишу о результатах. Цитата(BRE @ 29.9.2009, 20:02) Link 2 piton Перечитал первый пост темы и у меня возник вопрос, а почему для всего этого не использовать QGraphicsView+QGraphicsScene. Эта связка и обеспечивает необходимый функционал. Глубина элементов есть, виджет на сцену поместить можно. Для этого надо переделать все, а проект уже идет не первый год. Может в следующих версиях на этом и будем основываться. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 11.8.2025, 20:20 |