Отрисовка стандартного виджета на буфер |
Здравствуйте, гость ( Вход | Регистрация )
Отрисовка стандартного виджета на буфер |
piton |
29.9.2009, 13:11
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 29.9.2009 Пользователь №: 1125 Спасибо сказали: 0 раз(а) Репутация: 0 |
Предисловие: есть движок, в котором реализованы мультимедиа объекты (картинки, видео, текст и т.д.) и их управление (загрузка, отрисовка, размещение на окне). Все объекты выводятся на окно в зависимости от их глубины (depth) размещения, т.е. объекты могут друг на друга наезжать и частично или полностью перекрывать друг друга. Все это дело должно работать как под виндой, так и под линуксами. Было принято решение использовать QT в качестве реализации главного окна и обработки мышиных и клавиатурных сообщений.
Сама суть: нужен ввод с клавиатуры в текстовое поле. В качестве эксперимента был взят класс QTextEdit. В принципе в нем все устраивает, за исключением одного момента: это отрисовка в буфер. Снять копию с виджета и поместить ее в тот же QImage не составляет труда, но нельзя запретить виджету рисоваться куда ему захочется. Под виндой это решалось просто, путем сабклассинга и подсовывание своего контекста рисования. В QT я не нашел способа подсунуть свой контекст для отрисовки. QT настырно продолжает рисовать на свой контекст. Пробовал переопределять функции, связанные с рисованием, но в QT они носят чисто информационный характер, т.е. как состоявшийся факт "я отрисовалась и если хочешь, можешь ты еще чего поверх нарисовать". Цель состоит в том, что бы можно было поле для ввода текста использовать от QT и при этом рисовать самому, перемешивая с другими объектами. Вопрос: возможно ли запретить виджету рисоваться куда ему захочется или дать виджету свой контекст для рисования и он сам туда рисовался, при этом не использовал контекст рисования родительского окна (фактически единственного окна)? |
|
|
rnd |
29.9.2009, 14:23
Сообщение
#2
|
Студент Группа: Участник Сообщений: 54 Регистрация: 22.7.2009 Пользователь №: 930 Спасибо сказали: 1 раз(а) Репутация: 0 |
наследуйтесь и переопределите QTextEdit::paintEvent - в нем рисуйте что надо
|
|
|
piton |
29.9.2009, 14:27
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 29.9.2009 Пользователь №: 1125 Спасибо сказали: 0 раз(а) Репутация: 0 |
наследуйтесь и переопределите QTextEdit::paintEvent - в нем рисуйте что надо Пробовал. Эта функция вызывается когда виджет уже отрисовался и оповещает о случившемся факте. А надо что бы он вообще не рисовался или рисовался только на определенный (свой) контекст. наследуйтесь и переопределите QTextEdit::paintEvent - в нем рисуйте что надо Пробовал. Эта функция вызывается когда виджет уже отрисовался и оповещает о случившемся факте. А надо что бы он вообще не рисовался или рисовался только на определенный (свой) контекст. |
|
|
ViGOur |
29.9.2009, 15:10
Сообщение
#4
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Пробовал. покажи код, которым пробовал нарисовать что-то на виджите!Эта функция вызывается когда виджет уже отрисовался и оповещает о случившемся факте. И еще, читал: Система рисования Arthur? Сообщение отредактировал ViGOur - 29.9.2009, 15:05 |
|
|
piton |
29.9.2009, 15:42
Сообщение
#5
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 29.9.2009 Пользователь №: 1125 Спасибо сказали: 0 раз(а) Репутация: 0 |
Пробовал. покажи код, которым пробовал нарисовать что-то на виджите!Эта функция вызывается когда виджет уже отрисовался и оповещает о случившемся факте. И еще, читал: Система рисования Arthur? Читал, не помогло... Мне не надо рисовать на виджете, мне надо что бы он рисовался на моем контексте и больше ни где не рисовался. Рисовать на виджете не сложно и есть куча вариантов как это делать. Ситуация в следующем состоит: при загрузке QT приложения, создается только одно окно (на примере винды это хорошо видно, если посмотреть при помощи spy++ от вижуальника). В винде под каждый компонент, как правило, создается свое дочернее окно. Т.е. получается, что все объекты в QT рисуются на контекст главного окна. Что бы вклинится в отрисовку надо либо всем объектам наследоваться от QT и создавать на основе QT слоеный пирог на отрисовку, либо найти способ, который позволит заставить виджет рисовать свое содержимое на собственный контекст, а не на контекст главного окна. Как заставить виджет рисоваться на сторонний контекст и при этом принадлежать главному окну или вообще не рисоваться никогда (в не зависимости от его видимости, при этом грабить его содержимое через grabWidget(...)) мне пока вообще не понятно. Пробовал виджет скрывать, но при этом он не реагирует на любую просьбу нарисоваться. Так же пробовал вывести его за область видимости в самом окне, так там стоит оптимизация, если виджет не видим или его часть, то эта часть просто не рисуется. Возможно, надо использовать свой класс (наследовать его от QPaintEngine, QPaintDevice), но я так и не нашел способа, что бы скормить виджету его и что бы он рисовал через него. |
|
|
Litkevich Yuriy |
29.9.2009, 15:46
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Эта функция вызывается когда виджет уже отрисовался нет, только когда он хочет рисоваться.Ещё можешь почитать про технологию "Мужик", как мы её окрестили |
|
|
piton |
29.9.2009, 16:15
Сообщение
#7
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 29.9.2009 Пользователь №: 1125 Спасибо сказали: 0 раз(а) Репутация: 0 |
Эта функция вызывается когда виджет уже отрисовался нет, только когда он хочет рисоваться.Хорошо.
Может есть возможность во время paintEvent(...) снимать копию изображения с виджета или говорить ему что надо отрисовать на сторонний контекст? Ещё можешь почитать про технологию "Мужик", как мы её окрестили Спасибо за пример. Но немного не по моей теме. . Может и ошибаюсь.... |
|
|
Litkevich Yuriy |
29.9.2009, 16:27
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
piton |
29.9.2009, 16:54
Сообщение
#9
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 29.9.2009 Пользователь №: 1125 Спасибо сказали: 0 раз(а) Репутация: 0 |
отрисовать на сторонний контекст? я честно говоря не совсем понимаю, что значит на сторонний. И что значит на контекст, на чём-то другом кроме экрана?Если так то можно посмотреть в сторону QImage. В QT все объекты рисуются на главное окно. Мне надо что бы виджет (QTextEdit) рисовался, скажем. на QImage и только на него, что бы виджет не рисовался на главное окно. Я знаю как рисовать на QImage, но при этом видже одновременно рисуется на главное окно. Если его скрывать или убирать за пределы окна, то он тупо перестает рисоваться, даже на QImage. сторонний - все что угодно, только не главное окно на контекст - HDC, QImage, QPixmap и т.д. |
|
|
BRE |
29.9.2009, 17:05
Сообщение
#10
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
|
|
|
Текстовая версия | Сейчас: 29.3.2024, 9:25 |