crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Отрисовка стандартного виджета на буфер
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  


Цитата(rnd @ 29.9.2009, 15:23) *
наследуйтесь и переопределите QTextEdit::paintEvent - в нем рисуйте что надо


Пробовал.
Эта функция вызывается когда виджет уже отрисовался и оповещает о случившемся факте.

А надо что бы он вообще не рисовался или рисовался только на определенный (свой) контекст.

Цитата(rnd @ 29.9.2009, 15:23) *
наследуйтесь и переопределите QTextEdit::paintEvent - в нем рисуйте что надо


Пробовал.
Эта функция вызывается когда виджет уже отрисовался и оповещает о случившемся факте.

А надо что бы он вообще не рисовался или рисовался только на определенный (свой) контекст.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 29.9.2009, 15:10
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Цитата(piton @ 29.9.2009, 15:27) *
Пробовал.
Эта функция вызывается когда виджет уже отрисовался и оповещает о случившемся факте.
покажи код, которым пробовал нарисовать что-то на виджите!

И еще, читал: Система рисования Arthur?

Сообщение отредактировал ViGOur - 29.9.2009, 15:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
piton
  опции профиля:
сообщение 29.9.2009, 15:42
Сообщение #5


Новичок


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

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




Репутация:   0  


Цитата(ViGOur @ 29.9.2009, 16:10) *
Цитата(piton @ 29.9.2009, 15:27) *
Пробовал.
Эта функция вызывается когда виджет уже отрисовался и оповещает о случившемся факте.
покажи код, которым пробовал нарисовать что-то на виджите!

И еще, читал: Система рисования 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, 18:27) *
Эта функция вызывается когда виджет уже отрисовался
нет, только когда он хочет рисоваться.

Ещё можешь почитать про технологию "Мужик", как мы её окрестили :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
piton
  опции профиля:
сообщение 29.9.2009, 16:15
Сообщение #7


Новичок


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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 29.9.2009, 16:46) *
Цитата(piton @ 29.9.2009, 18:27) *
Эта функция вызывается когда виджет уже отрисовался
нет, только когда он хочет рисоваться.

Хорошо.

class myEdit : public QTextEdit
{
public:
  myEdit(QWidget *parent)
    : QTextEdit(parent)
  {
  }

protected:
  virtual void paintEvent(QPaintEvent *event)
  {
    /*
      Тут мы можем что нарисовать, но мне это не нужно
    */

    // Если принять сообщение
    event->accept();
    // то и граб и рендер не будет работать, т.е. это полностью глушит отрисовку

    // Если же вызвать родителя, то виджет смело отрисуется на контекст главного окна.
    QTextEdit::paintEvent(event);
  }
}

Может есть возможность во время paintEvent(...) снимать копию изображения с виджета или говорить ему что надо отрисовать на сторонний контекст?

Цитата(Litkevich Yuriy @ 29.9.2009, 16:46) *
Ещё можешь почитать про технологию "Мужик", как мы её окрестили :)

Спасибо за пример. Но немного не по моей теме. :unsure: . Может и ошибаюсь....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.9.2009, 16:27
Сообщение #8


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

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

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




Репутация:   94  


Цитата(piton @ 29.9.2009, 20:15) *
отрисовать на сторонний контекст?
я честно говоря не совсем понимаю, что значит на сторонний. И что значит на контекст, на чём-то другом кроме экрана?

Если так то можно посмотреть в сторону QImage.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
piton
  опции профиля:
сообщение 29.9.2009, 16:54
Сообщение #9


Новичок


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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 29.9.2009, 17:27) *
Цитата(piton @ 29.9.2009, 20:15) *
отрисовать на сторонний контекст?
я честно говоря не совсем понимаю, что значит на сторонний. И что значит на контекст, на чём-то другом кроме экрана?

Если так то можно посмотреть в сторону QImage.

В QT все объекты рисуются на главное окно. Мне надо что бы виджет (QTextEdit) рисовался, скажем. на QImage и только на него, что бы виджет не рисовался на главное окно. Я знаю как рисовать на QImage, но при этом видже одновременно рисуется на главное окно. Если его скрывать или убирать за пределы окна, то он тупо перестает рисоваться, даже на QImage.

сторонний - все что угодно, только не главное окно
на контекст - HDC, QImage, QPixmap и т.д.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 29.9.2009, 17:05
Сообщение #10


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

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

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




Репутация:   44  


Цитата(piton @ 29.9.2009, 17:54) *
сторонний - все что угодно, только не главное окно
на контекст - HDC, QImage, QPixmap и т.д.

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

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


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




RSS Текстовая версия Сейчас: 28.3.2024, 22:30