На этом шаге рассмотрим пример размещения элементов на сцене, положение которых можно изменять при помощи мыши.
На рис. 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 будет самостоятельно распознавать столкновения.
На следующем шаге рассмотрим классы событий графического представления.