LINUX.ORG.RU

вопрос про QGraphicsView


0

1

здравствуйте! подскажите пожалуйста: есть класс №1 унаследованный от QWidget. на экземпляре данного класса я,переопределив paintevent(), отображаю данные: это графические примитивы QPainter - данные обработки, координатная сетка и тд). также переопределены wheelevent(), mousemoveevent() и т.п.

теперь стоит задача поверх всего этого отображать служебную информацию в виде формуляров(текстовая надпись + фигурка-значок), которые будут перемещаться по координатной плоскости. также требуется интерактивность, т.е. реагирование на мышку и т.д.

хочу реализовать данный пункт с помощью graphics framework: таким образом, для формуляров создаю класс унаследованный от QGraphicsItem; создаю сцену QGraphicsScene.

вот теперь непонятно как лучше отобразить сцену? можно сделать рендеринг сцены в класс №1, или надо создать отдельный QGraphicsView?


А в чем, собственно, вопрос?

Как лучше - кроме вас никто не знает. Да и особой проблемы нет вместо QWidget использовать QGraphicsView. Виду добавляете QGraphicsScene, добавляете на сцену потомков QGraphicsItem, если они создаются с флагом ItemIsSelectable и ItemIsMovable, тогда эти объекты можно будет двигать мышой и прочие операции.

braboar ★★
()
Ответ на: комментарий от bejevy

В документации посмотрите примеры использования QGraphicsView - Diagram Scene и Drag and Drop Robot. Мне, например, потребовалось наследоваться от QGraphicsScene, а QGraphicsView оставил как есть.

The graphics scene manages the items and provides a surface for them. QGraphicsView is a widget that is used to render a scene on the screen.

Переопределять paint(QPainter *painter, const StyleOptionGraphicsItem *, QWidget *) потребовалось в потомках QGraphicsItem для рисования конкретных элементов. Далее просто добавляете item'ы на scene и обрабатываете мышиные события и управляете положением item'ов на сцене.

braboar ★★
()
Ответ на: комментарий от bejevy

Попробуй, вместо paintevent() использовать drawBackground() или drawForeground(). Тогда сможешь пользоваться и QGraphicsItem`ами и QPainter`ом.

akinator ★★
()
Ответ на: комментарий от akinator

сделал так: создал сцену QGraphicsScene, переопределил drawbackground(), где прописываю команды qpainter. добавляю свои items. все рисуется нормально.

также же переопределил функции mouseMoveEvent(), wheelEvent() и keyPressEvent() - но они не работают, дело в том, что их перехватывает QGraphicsView виджет, который исполььзвуется для рендеринга. как обойти этот момент?

bejevy
() автор топика
Ответ на: комментарий от bejevy

Обработки event'ов должны возвращать нечто вроде

return QGraphicsView::mousePressEvent(event);

braboar ★★
()
Ответ на: комментарий от akinator

я сделал так: в qraphicsview я переопределяю drawbackground(), где рисую qpainter-ом. по команде viewport().update() - перерисовываю. в qgraphicsscene содержит произвольные item-ы, которые должны реагировать на действия мышки (перенос и т.д).

проблема в том, что в graphicsview я переопределил функцию mouseMoveEvent() и теперь item-ы в graphicsscene не реагируют на действия мышки (признак itemsmovable выставлен).

как решить этот момент?

bejevy
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.