Шаг 235.
Библиотека Qt.
Виджеты в графическом представлении

    На этом шаге рассмотрим пример размещения виджетов в графическом представлении.

    Класс 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.




Предыдущий шаг Содержание Следующий шаг