Russian Qt Forum
Ноябрь 05, 2024, 22:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как рисовать на виджете при срабатывании события перерисовки у окна?  (Прочитано 2649 раз)
Кусай
Гость
« : Январь 20, 2011, 15:16 »

Дело вот в чем: имеется главное окно, у него есть QWidget *widget; и QPainter *painter;
А также обрабатывается событие (или перегружается, не знаю что там) void paintEvent(QPaintEvent *event);
В конструкторе окна и виджет, и пейнтер создаются, им присваиваются родители и все такое прочее.
Код:
TWindow::TWindow()
{
...
    field = new QWidget(this);
    field->setGeometry(10, 50, 620, 400);
    painter = new QPainter();
...
}

Теперь реализация paintEvent:

Код:
void TWindow::paintEvent(QPaintEvent *event)
{
    painter->begin(field); //если здесь подставить (вместо field) this, то рисует, как и должно быть! То есть в других местах кода ошибки нет
    painter->fillRect(0,0, field->width(),field->height(),QBrush(QColor(0,2,127,255)));
       
    painter->end();
}

Если не учитывать комментарий, то выдает следующее в консоль:
QPainter::begin: Paint device returned engine == 0, type: 1
Вследствие чего еще QPainter::end: Painter not active, aborted

И не рисует синее на виджете.
Если поменять field на this, то естественно рисует - синий прямоугольник. Размеры у виджета задал.
Естественно, ошибки повторяются кучу раз, сколько раз окно перерисовывается.

Так вот, суть проблемы:
Как сделать, чтобы при срабатывании события перерисовки у главного окна: на виджете, принадлежащем этому окну, можно было рисовать с помощью QPainter?
Один из путей решения проблемы - сделать наследника от виджета, у которого перегрузить такое событие (то бишь обрабатывать MyWidget::paintEvent(QPaintEvent *event), то все работает. Но не делать же наследника из-за одной несчастной перегрузки? По идее, если у меня виджет лежит на окне, то на нем должно быть можно рисовать из методов главного окна...

Если вопрос требует телепатов, постараюсь разжевать еще подробнее.

Записан
igor_bogomolov
Гость
« Ответ #1 : Январь 20, 2011, 15:34 »

Нужно в TWindow установить фильтр событий для field, ловить QEvent::Paint и отрисовывать то что нужно
См. bool QObject::eventFilter ( QObject * watched, QEvent * event ) [virtual]
Записан
Fat-Zer
Гость
« Ответ #2 : Январь 20, 2011, 15:58 »

ИМХО проще и правильнее унаследовать...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 21.