Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Кусай от Январь 20, 2011, 15:16



Название: Как рисовать на виджете при срабатывании события перерисовки у окна?
Отправлено: Кусай от Январь 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), то все работает. Но не делать же наследника из-за одной несчастной перегрузки? По идее, если у меня виджет лежит на окне, то на нем должно быть можно рисовать из методов главного окна...

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



Название: Re: Как рисовать на виджете при срабатывании события перерисовки у окна?
Отправлено: igor_bogomolov от Январь 20, 2011, 15:34
Нужно в TWindow установить фильтр событий для field, ловить QEvent::Paint и отрисовывать то что нужно
См. bool QObject::eventFilter ( QObject * watched, QEvent * event ) [virtual]


Название: Re: Как рисовать на виджете при срабатывании события перерисовки у окна?
Отправлено: Fat-Zer от Январь 20, 2011, 15:58
ИМХО проще и правильнее унаследовать...