Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: FreeSlave от Июль 26, 2011, 20:12



Название: Обработка событий в QGraphicsItem
Отправлено: FreeSlave от Июль 26, 2011, 20:12
Наследовал QGraphicsItem, переопределил функции paint и boundingRect. Вопрос: как осуществлять перерисовку объекта при определенном событии? Например, нажатие мыши. Ясно, что через mousePressEvent, но как именно?


Название: Re: Обработка событий в QGraphicsItem
Отправлено: Mikhail от Июль 26, 2011, 20:40
update() не устроит?


Название: Re: Обработка событий в QGraphicsItem
Отправлено: FreeSlave от Июль 26, 2011, 22:26
Можно поконкретней? Под перерисовкой я имею в виду изменение внешнего вида элемента, а не перерисовку того же самого.


Название: Re: Обработка событий в QGraphicsItem
Отправлено: vintik от Июль 27, 2011, 00:29
завести флаг, по событию флаг менять и вызывать update().
в paint засунуть, скажем, switch и отрисовку делать в зависимости от значения флага.


Название: Re: Обработка событий в QGraphicsItem
Отправлено: FreeSlave от Июль 27, 2011, 18:51
А откуда вообще вызывается метод paint? Раз уж в него передается painter, может, передавать уже готовый QPainter, а потом просто им отрисовывать нужную фигуру? Со свитчем как-то некрасиво по-моему.


Название: Re: Обработка событий в QGraphicsItem
Отправлено: FreeSlave от Июль 28, 2011, 20:12
И что вы имейте в виду под флагом? Новый атрибут в самом классе?


Название: Re: Обработка событий в QGraphicsItem
Отправлено: vintik от Июль 28, 2011, 22:38
по поводу метода paint - http://doc.crossplatform.ru/qt/4.7.x/qgraphicsitem.html#paint
так же paint отрабатывает после вызова update().
Под флагом, да, я имею ввиду атрибут класса. На мой взгляд, вполне покатит)
А QPainter нада настраивать непосредственно в методе paint
Примерно так:
void YourItem::paint(QPainter *_painter, const QStyleOptionGraphicsItem* _style, QWidget* _widget)
{
  _painter->save();  // сохраняем настройки пэинтера

  _painter->setPen(Qt::green);   // делаем новые настройки пэинтера и рисуем чё-то своё
  QRectF rectangle(10.0, 20.0, 80.0, 60.0);
  _painter->drawRect(rectangle);

  _painter->restore();   // восстанавливаем настройки пэинтера, если дальше хотим рисовать что-то пэинтером из входного параметра

  // рисуем что-то пэинтером из входного параметра
}