Russian Qt Forum
Июнь 01, 2024, 16:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: paintEvent для QGraphicsView  (Прочитано 6858 раз)
0...-5
Гость
« : Февраль 03, 2011, 23:24 »

Ребят, вопрос такой: можно ли переопределить обработчик события рисования для QGraphicsView, чтобы иметь возможность помимо отрисовки сцены рисовать что-то в координатах виджета? Т.е. сделать нечто вроде
Код:
void MyGraphicsView::paintEvent(QPaintEvent* event)
{
     QGraphicsView::paintEvent(event);
     QPainter painter(this);
     doSomething(&painter);
}
Записан
_govorilka
Гость
« Ответ #1 : Февраль 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'ом сообщения мыши уже не обрабатывает, здесь надо прокидывать их до папы самому.
Записан
0...-5
Гость
« Ответ #2 : Февраль 04, 2011, 07:42 »

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

Виджет у которого есть папа, по умолчанию фон прозрачный. Фон QGraphicsView точно не перекроет.

Для пересчета координат в функцию drawForeground() стоит поковырять в сторону QPainter::setTransform(), но как правильно составить матрицу я не знаю. 
Записан
_govorilka
Гость
« Ответ #4 : Февраль 04, 2011, 07:55 »

Флаг QGraphicsItem::ItemIgnoresTransformations заставляет QGraphiscItem игнорировать преобразования координат, фактически заставляет жить его в координатах QGraphicsView к которому относится сцена.
Записан
0...-5
Гость
« Ответ #5 : Февраль 04, 2011, 08:10 »

Это все замечательно, но я не элементы сцены собираюсь отрисовывать! Допустим надо поверх виджета нанести сетку с подписями, тогда удобнее пользоваться именно отрисовкой по виджету в его же координатах...
Записан
_govorilka
Гость
« Ответ #6 : Февраль 04, 2011, 08:21 »

Какой путь выбрать... Это дело вкуса, каждый имеет свои преимущества и недостатки.
« Последнее редактирование: Февраль 04, 2011, 08:27 от _govorilka » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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