На этом шаге рассмотрим пример размещения элементов на сцене, положение которых можно изменять при помощи мыши.
На рис. 1 показано размещение четырех элементов на сцене.
Рис.1. Отображение элементов, положение которых можно изменять при помощи мыши
int main(int argc, char** argv) { //создаем объект приложения app QApplication app(argc, argv); //создаем объекты классов QGraphicsScene и QGraphicsView QGraphicsScene scene(QRectF(-100, -100, 300, 300)); /*виджет view при создании получает адрес объекта scene, но в качестве альтернативы можно воспользоваться методом QGraphicsView::setScene()*/ QGraphicsView view(&scene); /*вызовами методов QGraphicsScene::addPixmap(), QGraphicsScene::addText() и QGraphicsScene::addLine() в сцену добавляются элементы растрового изображения, текста и линии*/ QGraphicsPixmapItem* pPixmapItem = scene.addPixmap(QPixmap("koala.jpg")); /*для того чтобы все добавленные элементы можно было перемещать мышью, эта возможность активизируется передачей в метод setFlags() значения QGraphicsItem::ItemIsMoveable*/ pPixmapItem->setFlags(QGraphicsItem::ItemIsMovable); QGraphicsTextItem* pTextItem = scene.addText("Передвигай нас с помощью мыши"); pTextItem->setFlags(QGraphicsItem::ItemIsMovable); QGraphicsLineItem* pLineItem = scene.addLine(QLineF(-10, -10, -80, -80), QPen(Qt::red, 2)); pLineItem->setFlags(QGraphicsItem::ItemIsMovable); создаем прямоугольный элемент QGraphicsRectItem* pRectItem = new QGraphicsRectItem(); /*вызов метода setPen() устанавливает черный цвет пера для контурной линии элемента*/ pRectItem->setPen(QPen(Qt::black)); /*кисть, предназначенная для заливки фона элемента, получает зеленый цвет с помощью метода setBrush()*/ pRectItem->setBrush(QBrush(Qt::green)); //метод setRect() задает расположение и размеры прямоугольной области pRectItem->setRect(QRectF(-30, -30, 120, 80)); pRectItem->setFlags(QGraphicsItem::ItemIsMovable); scene.addItem(pRectItem); /*вызовом метода show() сцена отображается в представлении и ее элементы становятся видимыми на экране*/ view.show(); return app.exec(); }
Файлы приложения можно взять здесь.
Элементы, подобно виджетам, могут содержать другие элементы, что позволяет осуществлять их группировку. Расположение элементов-потомков выполняется относительно предка, например, в прямоугольном элементе будет отображаться текст "Предок", который будет передвигаться вместе с этой областью при ее перемещении:
QGraphicsTextItem* pTextItem1 = scene.addText("Потомок"); pTextItem1->setParentItem(pRectItem);
Класс QGraphicsItem предоставляет возможность определения столкновений элементов. Это задача выполняется с помощью методов QGraphics::shape() и QGraphicsItem::collidesWith(). Если вы создаете свой класс элемента, то для определения столкновений необходимо будет перезаписать метод QGraphicsItem::shape(). Этот метод должен возвращать форму элемента в локальных координатах. Благодаря этому класс QGraphicsItem будет самостоятельно распознавать столкновения.
На следующем шаге рассмотрим классы событий графического представления.