На этом шаге рассмотрим пример размещения виджетов в графическом представлении.
Класс QGraphicsScene предоставляет возможность размещения не только графических объектов, но и виджетов, причем благодаря механизму событий помещенные в качестве элементов виджеты не теряют своей функциональности и реагируют на действия пользователя, как обычные виджеты. Однако самое интересное свойство состоит в том, что, как только виджет становится элементом сцены, с ним можно выполнять те же геометрические преобразования, что и c обычными графическими элементами, а также использовать механизм для определения столкновений. Это открывает большой простор для фантазии — ведь вы сможете теперь реализовывать пользовательские интерфейсы очень необычного вида. Продемонстрируем эту возможность на конкретном примере и разместим в сцене три виджета (рис. 1).

Рис.1. Виджеты в графическом представлении
int main(int argc, char** argv)
{
QApplication app(argc, argv);
//создаем объект сцены (scene)
QGraphicsScene scene(QRectF(0, 0, 400, 400));
//и виджет представления (view)
QGraphicsView view(&scene);
//создаем виджет кнопки Выход
QPushButton cmd("Выход");
/*добавляем ее при помощи метода сцены addWidget(),
который возвращает объект элемента сцены QGraphicsProxyWidget. С этим
элементом можно осуществлять геометрические преобразования*/
QGraphicsProxyWidget* pproxyWidget = scene.addWidget(&cmd);
/*класс QTransform предоставляет методы сдвига translate(),
поворота rotate() и масштабирования scale()*/
QTransform transform = pproxyWidget->transform();
transform.translate(100, 350);
/*в методе rotate() помимо угла поворота мы также указываем и ось,
вокруг которой нужно осуществить поворот - это ось Y (Qt::YAxis)*/
transform.rotate(-45, Qt::YAxis);
transform.scale(8, 2);
/*геометрическое преобразование применяется к элементу (указатель pproxyWidget)
вызовом метода setTransform()*/
pproxyWidget->setTransform(transform);
/*выполняем сигнально-слотовые соединения виджетов -
кнопку Выход связываем со слотом приложения quit()*/
QObject::connect(&cmd, SIGNAL(clicked()), &app, SLOT(quit()));
QDial dia;
dia.setNotchesVisible(true);
pproxyWidget = scene.addWidget(&dia);
transform = pproxyWidget->transform();
transform.scale(4, 2);
transform.rotate(-45, Qt::YAxis);
pproxyWidget->setTransform(transform);
QProgressBar prb;
prb.setFixedSize(500, 40);
pproxyWidget = scene.addWidget(&lprb);
transform = pproxyWidget->transform();
transform.translate(20, 200);
transform.scale(2, 2);
transform.rotate(80, Qt::YAxis);
transform.rotate(30, Qt::XAxis);
pproxyWidget->setTransform(transform);
/*выполняем сигнально-слотовые соединения виджетов - сигнал valueChanged()
виджета QDial — со слотом setValue() виджета QProgressBar*/
QObject::connect(&dia, SIGNAL(valueChanged(int)),
&prb, SLOT(setValue(int))
);
//осуществляем трансформацию сцены и поворачиваем ее на 15 градусов по оси Z
view.rotate(15);
view.show();
return app.exec();
}Файлы приложения можно взять здесь.
На следующем шаге рассмотрим класс QMovie.