Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: 0...-5 от Февраль 03, 2011, 23:24



Название: paintEvent для QGraphicsView
Отправлено: 0...-5 от Февраль 03, 2011, 23:24
Ребят, вопрос такой: можно ли переопределить обработчик события рисования для QGraphicsView, чтобы иметь возможность помимо отрисовки сцены рисовать что-то в координатах виджета? Т.е. сделать нечто вроде
Код:
void MyGraphicsView::paintEvent(QPaintEvent* event)
{
     QGraphicsView::paintEvent(event);
     QPainter painter(this);
     doSomething(&painter);
}


Название: Re: paintEvent для QGraphicsView
Отправлено: _govorilka от Февраль 04, 2011, 07:29
Да, можно. paintEvent() для всех наследников QWidget работает одинаково. Только не забывай вызывать функцию самого QGraphicsView в начале своей.

Для "просто рисования", лучше использовать QGraphicsScene::drawForeground(), QGraphicsScene::drawBackground() или QGraphicsItem c установленым флагом QGraphicsItem::ItemIgnoresTransformations.

В прошлом проекте, для подобной задачи добавлял QWidget сверху:

Код:
QGraphicsView* view = new QGraphicsView();
QWidget* widget = new QWidget(view);

Тогда ты получаешь еще и отдельную обработку мышки. Минус в том, что все что назодится под таким QWidget'ом сообщения мыши уже не обрабатывает, здесь надо прокидывать их до папы самому.


Название: Re: paintEvent для QGraphicsView
Отправлено: 0...-5 от Февраль 04, 2011, 07:42
Ну насчет drawBackcgound и drawForeground, то в документации по ним сказано:
Цитировать
All painting is done in scene coordinates.
Мне же надо иметь возможность рисования в координатах виджета.
А вот использовать QWidget сверху - это интересно))А что будет если я передам компоновщику QGrapicsView? И не перекроет ли верхний виджет его целиком(точнее его фон)?


Название: Re: paintEvent для QGraphicsView
Отправлено: _govorilka от Февраль 04, 2011, 07:51
Виджет у которого есть папа, по умолчанию фон прозрачный. Фон QGraphicsView точно не перекроет.

Для пересчета координат в функцию drawForeground() стоит поковырять в сторону QPainter::setTransform(), но как правильно составить матрицу я не знаю. 


Название: Re: paintEvent для QGraphicsView
Отправлено: _govorilka от Февраль 04, 2011, 07:55
Флаг QGraphicsItem::ItemIgnoresTransformations заставляет QGraphiscItem игнорировать преобразования координат, фактически заставляет жить его в координатах QGraphicsView к которому относится сцена.


Название: Re: paintEvent для QGraphicsView
Отправлено: 0...-5 от Февраль 04, 2011, 08:10
Это все замечательно, но я не элементы сцены собираюсь отрисовывать! Допустим надо поверх виджета нанести сетку с подписями, тогда удобнее пользоваться именно отрисовкой по виджету в его же координатах...


Название: Re: paintEvent для QGraphicsView
Отправлено: _govorilka от Февраль 04, 2011, 08:21
Какой путь выбрать... Это дело вкуса, каждый имеет свои преимущества и недостатки.