crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

piton
  опции профиля:
сообщение 29.9.2009, 13:11
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 29.9.2009
Пользователь №: 1125

Спасибо сказали: 0 раз(а)




Репутация:   0  


Предисловие: есть движок, в котором реализованы мультимедиа объекты (картинки, видео, текст и т.д.) и их управление (загрузка, отрисовка, размещение на окне). Все объекты выводятся на окно в зависимости от их глубины (depth) размещения, т.е. объекты могут друг на друга наезжать и частично или полностью перекрывать друг друга. Все это дело должно работать как под виндой, так и под линуксами. Было принято решение использовать QT в качестве реализации главного окна и обработки мышиных и клавиатурных сообщений.

Сама суть: нужен ввод с клавиатуры в текстовое поле. В качестве эксперимента был взят класс QTextEdit. В принципе в нем все устраивает, за исключением одного момента: это отрисовка в буфер. Снять копию с виджета и поместить ее в тот же QImage не составляет труда, но нельзя запретить виджету рисоваться куда ему захочется. Под виндой это решалось просто, путем сабклассинга и подсовывание своего контекста рисования. В QT я не нашел способа подсунуть свой контекст для отрисовки. QT настырно продолжает рисовать на свой контекст. Пробовал переопределять функции, связанные с рисованием, но в QT они носят чисто информационный характер, т.е. как состоявшийся факт "я отрисовалась и если хочешь, можешь ты еще чего поверх нарисовать". Цель состоит в том, что бы можно было поле для ввода текста использовать от QT и при этом рисовать самому, перемешивая с другими объектами.

Вопрос: возможно ли запретить виджету рисоваться куда ему захочется или дать виджету свой контекст для рисования и он сам туда рисовался, при этом не использовал контекст рисования родительского окна (фактически единственного окна)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V  < 1 2  
Начать новую тему
Ответов (10 - 15)
piton
  опции профиля:
сообщение 29.9.2009, 17:16
Сообщение #11


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 29.9.2009
Пользователь №: 1125

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(BRE @ 29.9.2009, 18:05) Link
Думаю стоит смотреть в сторону QPaintEngine, и делать своего наследника...


Я так и не смог найти какого-либо примера или информации как это можно сделать. Хвостов у виджета в сторону QPaintEngine тоже не обнаружил. :(
Если есть какие либо мысли, с удовольствие выслушаю.

Цитата(BRE @ 29.9.2009, 18:05) Link
Думаю стоит смотреть в сторону QPaintEngine, и делать своего наследника...


Я так и не смог найти какого-либо примера или информации как это можно сделать. Хвостов у виджета в сторону QPaintEngine тоже не обнаружил. :(
Если есть какие либо мысли, с удовольствие выслушаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 29.9.2009, 17:23
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(piton @ 29.9.2009, 18:08) Link
Я так и не смог найти какого-либо примера или информации как это можно сделать. Хвостов у виджета в сторону QPaintEngine тоже не обнаружил. :(
Если есть какие либо мысли, с удовольствие выслушаю.

Мысль следующая....
Любой виджет это QPaintDevice, в начале рисования он создает QPainter, которому указывает себя в качестве поверхности для рисования. Этот вызов идет в QPaintEngine::begin( QPaintDevice * pdev ). Это виртуальный метод, если его переопределить, то можно попробовать использовать вместо pdev свое устройство отображения.

Это только мысли.

Сообщение отредактировал BRE - 29.9.2009, 18:13
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rnd
  опции профиля:
сообщение 29.9.2009, 17:33
Сообщение #13


Студент
*

Группа: Участник
Сообщений: 54
Регистрация: 22.7.2009
Пользователь №: 930

Спасибо сказали: 1 раз(а)




Репутация:   0  


Самое просто в таких случаях - смотреть исходники куте и дебажится
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.9.2009, 17:59
Сообщение #14


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


piton, тут меня одна мыслишка посетила. Значится баловался я QWebClient'ом, Link.
Смысл его простой, вместо корневого виджета в своей программе, например, QWidget, устанавливаешь QWebClient. Компилируешь и запускашь.
Открываешь браузер и вводишь адрес: Link и видешь в браузере свою программу (и она работает). Link

Суть мысли:
я заметил, что работает это так: запускашь свою программу, появляется её окно, но как только ты в браузере обращаешся к ней. Окно обычное исчезает. Стало бвть рисование проболжается не на окошке.

Может там почерпнёшь, чтони-будь интересное?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 29.9.2009, 19:02
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


2 piton

Перечитал первый пост темы и у меня возник вопрос, а почему для всего этого не использовать QGraphicsView+QGraphicsScene. Эта связка и обеспечивает необходимый функционал. Глубина элементов есть, виджет на сцену поместить можно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
piton
  опции профиля:
сообщение 30.9.2009, 13:02
Сообщение #16


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 29.9.2009
Пользователь №: 1125

Спасибо сказали: 0 раз(а)




Репутация:   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. Эта связка и обеспечивает необходимый функционал. Глубина элементов есть, виджет на сцену поместить можно.

Для этого надо переделать все, а проект уже идет не первый год. Может в следующих версиях на этом и будем основываться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 11.8.2025, 20:20