Spec-Zone.ru › Qt 5.9

Фреймворк для отображения графики

Графический фреймворк предоставляет поверхность для управления и взаимодействия с большим количеством настраиваемых 2D графических элементов и виджет для визуализации элементов с поддержкой масштабирования и поворота.

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

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

Графический фреймворк был представлен в Qt 4.2, заменив своего предшественника, QCanvas.

Темы:

Архитектура графического представления

Графический фреймворк использует подход на основе элементов для моделирования программирования, подобно удобным классам InterView QTableView, QTreeView и QListView. Несколько представлений могут наблюдать за одной сценой, а сцена содержит элементы различных геометрических форм.

Сцена

QGraphicsScene предоставляет сцену графического представления. Сцена отвечает за следующие задачи:

  • Предоставление быстрого интерфейса для управления большим количеством элементов
  • Распространение событий каждому элементу
  • Управление состоянием элементов, таким как выбор и обработка фокуса
  • Предоставление функциональности рендеринга без преобразований; в основном для печати

Сцена служит контейнером для объектов QGraphicsItem. Элементы добавляются в сцену с помощью вызова QGraphicsScene::addItem(), а затем извлекаются с помощью одной из многих функций поиска элементов. QGraphicsScene::items() и её перегрузки возвращают все элементы, содержащиеся в или пересекающиеся с точкой, прямоугольником, многоугольником или общей векторной траекторией. QGraphicsScene::itemAt() возвращает самый верхний элемент в определенной точке. Все функции поиска элементов возвращают элементы в порядке убывания стека (т.е. первый возвращаемый элемент — самый верхний, а последний — самый нижний).

QGraphicsScene scene;
QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100));

QGraphicsItem *item = scene.itemAt(50, 50);
// item == rect

Архитектура распространения событий QGraphicsScene планирует события сцены для доставки элементам, а также управляет распространением между элементами. Если сцена получает событие нажатия мыши в определенной позиции, сцена передает событие элементу, находящемуся в этой позиции.

QGraphicsScene также управляет определёнными состояниями элементов, такими как выбор и фокус элементов. Вы можете выбрать элементы на сцене, вызвав QGraphicsScene::setSelectionArea(), передав произвольную форму. Эта функциональность также используется в качестве основы для выделения резиновой лентой в QGraphicsView. Чтобы получить список всех выбранных элементов, вызовите QGraphicsScene::selectedItems(). Другое состояние, обрабатываемое QGraphicsScene, — это наличие у элемента фокуса ввода с клавиатуры. Вы можете установить фокус на элементе, вызвав QGraphicsScene::setFocusItem() или QGraphicsItem::setFocus(), или получить текущий элемент фокуса, вызвав QGraphicsScene::focusItem().

Наконец, QGraphicsScene позволяет отобразить части сцены в устройстве рисования с помощью функции QGraphicsScene::render(). Более подробную информацию об этом можно найти в разделе «Печать» в этом документе.

Представление

QGraphicsView предоставляет виджет представления, который визуализирует содержимое сцены. Вы можете подключить несколько представлений к одной сцене, чтобы предоставить несколько областей просмотра для одного набора данных. Виджет представления — это область прокрутки, которая предоставляет полосы прокрутки для навигации по большим сценам. Чтобы включить поддержку OpenGL, вы можете установить QGLWidget в качестве области просмотра, вызвав QGraphicsView::setViewport().

QGraphicsScene scene;
myPopulateScene(&scene);

QGraphicsView view(&scene);
view.show();

Представление получает события ввода с клавиатуры и мыши, преобразует их в события сцены (при необходимости преобразуя используемые координаты в координаты сцены) перед отправкой событий визуализированной сцене.

Используя свою матрицу преобразования QGraphicsView::transform(), представление может преобразовывать систему координат сцены. Это позволяет использовать такие расширенные функции навигации, как масштабирование и вращение. Для удобства QGraphicsView также предоставляет функции для преобразования между координатами представления и сцены: QGraphicsView::mapToScene() и QGraphicsView::mapFromScene().

Элемент

QGraphicsItem — базовый класс для графических элементов в сцене. Графический фреймворк предоставляет несколько стандартных элементов для типичных фигур, таких как прямоугольники (QGraphicsRectItem), эллипсы (QGraphicsEllipseItem) и текстовые элементы (QGraphicsTextItem), но наиболее мощные возможности QGraphicsItem доступны, когда вы пишете свой собственный элемент. Среди прочего, QGraphicsItem поддерживает следующие функции:

  • События нажатия, перемещения, отпускания и двойного щелчка мышью, а также события наведения курсора, прокрутки колесика мыши и контекстного меню.
  • Фокус ввода с клавиатуры и события нажатия клавиш
  • Перетаскивание
  • Группировка, как через отношения родитель-потомок, так и с помощью QGraphicsItemGroup
  • Обнаружение коллизий

Элементы существуют в локальной системе координат, и, как и QGraphicsView, он также предоставляет множество функций для сопоставления координат между элементом и сценой, и от элемента к элементу. Также, как и QGraphicsView, он может преобразовывать свою систему координат, используя матрицу: QGraphicsItem::transform(). Это полезно для поворота и масштабирования отдельных элементов.

Элементы могут содержать другие элементы (дочерние). Преобразования родительских элементов наследуются всеми дочерними элементами. Однако независимо от накопленного преобразования элемента все его функции (например, QGraphicsItem::contains(), QGraphicsItem::boundingRect(), QGraphicsItem::collidesWith()) всё ещё работают в локальных координатах.

QGraphicsItem поддерживает обнаружение коллизий через функцию QGraphicsItem::shape() и QGraphicsItem::collidesWith(), которые являются виртуальными функциями. Возвращая форму вашего элемента в виде локальной координаты QPainterPath из QGraphicsItem::shape(), QGraphicsItem будет обрабатывать все обнаружение коллизий за вас. Если вы хотите обеспечить своё обнаружение коллизий, вы можете переопределить QGraphicsItem::collidesWith().

Классы в фреймворке для отображения графики

Эти классы предоставляют фреймворк для создания интерактивных приложений.

QGraphicsEffect

Базовый класс для всех графических эффектов

QGraphicsAnchor

Представляет якорную точку между двумя элементами в QGraphicsAnchorLayout

QGraphicsAnchorLayout

Макет, где можно закрепить виджеты вместе в представлении Graphics View

QGraphicsGridLayout

Сетка макета для управления виджетами в представлении Graphics View

QAbstractGraphicsShapeItem

Общий базовый класс для всех элементов пути

QGraphicsEllipseItem

Эллиптический элемент, который можно добавить в QGraphicsScene

QGraphicsItem

Базовый класс для всех графических элементов в QGraphicsScene

QGraphicsItemGroup

Контейнер, который обрабатывает группу элементов как один элемент

QGraphicsLineItem

Линейный элемент, который можно добавить в QGraphicsScene

QGraphicsObject

Базовый класс для всех графических элементов, которые требуют сигналов, слотов и свойств

QGraphicsPathItem

Элемент пути, который можно добавить в QGraphicsScene

QGraphicsPixmapItem

Элемент пиксельного изображения, который можно добавить в QGraphicsScene

QGraphicsPolygonItem

Полигональный элемент, который можно добавить в QGraphicsScene

QGraphicsRectItem

Прямоугольный элемент, который можно добавить в QGraphicsScene

QGraphicsSimpleTextItem

Простой текстовый элемент пути, который можно добавить в QGraphicsScene

QGraphicsTextItem

Текстовый элемент, который можно добавить в QGraphicsScene для отображения форматированного текста

QGraphicsLayout

Базовый класс для всех макетов в Graphics View

QGraphicsLayoutItem

Можно наследовать, чтобы позволить вашим пользовательским элементам управляться макетами

QGraphicsLinearLayout

Горизонтальный или вертикальный макет для управления виджетами в представлении Graphics View

QGraphicsProxyWidget

Прокси-слой для встраивания QWidget в QGraphicsScene

QGraphicsScene

Поверхность для управления большим количеством 2D графических элементов

QGraphicsSceneContextMenuEvent

События контекстного меню в рамках фреймворка графического представления

QGraphicsSceneDragDropEvent

События перетаскивания и помещения в рамках фреймворка графического представления

QGraphicsSceneEvent

Базовый класс для всех событий, связанных с графическим представлением

QGraphicsSceneHelpEvent

События, когда запрашивается всплывающая подсказка

QGraphicsSceneHoverEvent

События наведения курсора в рамках фреймворка графического представления

QGraphicsSceneMouseEvent

События мыши в рамках фреймворка графического представления

QGraphicsSceneMoveEvent

События перемещения виджета в рамках фреймворка графического представления

QGraphicsSceneResizeEvent

События изменения размера виджета в рамках фреймворка графического представления

QGraphicsSceneWheelEvent

События колеса мыши в рамках фреймворка графического представления

QGraphicsTransform

Абстрактный базовый класс для построения сложных преобразований QGraphicsItems

QGraphicsView

Виджет для отображения содержимого QGraphicsScene

QGraphicsWidget

Базовый класс для всех элементов виджетов в QGraphicsScene

QStyleOptionGraphicsItem

Используется для описания параметров, необходимых для рисования QGraphicsItem

QGraphicsSvgItem

QGraphicsItem, который может использоваться для рендеринга содержимого SVG-файлов

Система координат Graphics View

Graphics View основана на декартовой системе координат; положение и геометрия элементов на сцене представлены набором двух чисел: координаты x и y. При наблюдении сцены с помощью непрообразованного представления одна единица на сцене отображается одним пикселем на экране.

Примечание: Система координат с инвертированной осью Y (где y растет вверх) не поддерживается, так как Graphics View использует систему координат Qt.

В Graphics View действуют три эффективные системы координат: координаты элемента, координаты сцены и координаты представления. Для упрощения вашей реализации Graphics View предоставляет удобные функции, позволяющие отображать преобразования между тремя системами координат.

При рендеринге координаты сцены Graphics View соответствуют логическим координатам QPainter, а координаты представления — устройства. В документации по системе координат вы можете прочитать о взаимосвязи между логическими координатами и координатами устройства.

Координаты элемента

Элементы живут в своей собственной локальной системе координат. Их координаты обычно центрированы вокруг центральной точки (0, 0), и это также центр для всех преобразований. Геометрические примитивы в системе координат элемента часто называют точками элемента, линиями элемента или прямоугольниками элемента.

При создании пользовательского элемента, координаты элемента — все, о чем вам нужно беспокоится; QGraphicsScene и QGraphicsView выполнят все преобразования за вас. Это значительно упрощает реализацию пользовательских элементов. Например, если вы получаете событие нажатия мыши или событие ввода перетаскивания, позиция события задаётся в координатах элемента. Виртуальная функция QGraphicsItem::contains(), которая возвращает true, если определенная точка находится внутри элемента, и false в противном случае, принимает аргумент точки в координатах элемента. Аналогично, ограничительная рамка и форма элемента представлены в координатах элемента.

Позиция элемента — это координата центральной точки элемента в системе координат родителя; иногда называется координатами родителя. Сцена в этом смысле рассматривается как "родитель" всех элементов без родителя. Положение элементов верхнего уровня представлено в координатах сцены.

Координаты дочернего элемента относительны координатам родительского элемента. Если дочерний элемент не преобразован, разница между координатами дочернего и родительского элементов соответствует расстоянию между элементами в координатах родителя. Например, если не преобразованный дочерний элемент расположен точно в центре родительского элемента, то системы координат двух элементов будут идентичны. Однако, если позиция дочернего элемента равна (10, 0), точка (0, 10) дочернего элемента будет соответствовать точке (10, 10) родительского элемента.

Поскольку положение и преобразование элементов относительны к родителю, координаты дочерних элементов не затрагиваются преобразованием родителя, хотя преобразование родителя неявно преобразует дочерний элемент. В приведенном выше примере, даже если родительский элемент повернут и масштабирован, точка (0, 10) дочернего элемента всё равно будет соответствовать точке (10, 10) родительского элемента. Однако относительно сцены дочерний элемент будет следовать преобразованию и положению родителя. Если родитель масштабирован (2x, 2x), положение дочернего элемента будет в координатах сцены (20, 0), а его точка (10, 0) будет соответствовать точке (40, 0) на сцене.

За исключением QGraphicsItem::pos(), функции QGraphicsItem работают в координатах элемента, независимо от преобразований элемента или любого из его родителей. Например, ограничительная рамка элемента (т.е. QGraphicsItem::boundingRect()) всегда задаётся в координатах элемента.

Координаты сцены

Сцена представляет собой базовую систему координат для всех её элементов. Система координат сцены описывает положение каждого элемента верхнего уровня, а также служит основой для всех событий сцены, поступающих на сцену со стороны представления. Каждый элемент на сцене имеет координаты сцены и прямоугольник обводки (QGraphicsItem::scenePos(), QGraphicsItem::sceneBoundingRect()), помимо своих локальных координат и прямоугольника обводки. Координаты сцены описывают положение элемента в координатах сцены, а её прямоугольник обводки служит основой для того, как QGraphicsScene определяет, какие области сцены изменились. Изменения на сцене передаются через сигнал QGraphicsScene::changed(), и аргументом является список прямоугольников сцены.

Координаты представления

Координаты представления — это координаты виджета. Каждая единица в координатах представления соответствует одному пикселю. Особенностью этой системы координат является то, что она относительна к виджету или области просмотра и не зависит от отображаемой сцены. Левый верхний угол области просмотра QGraphicsView всегда равен (0, 0), а правый нижний угол всегда равен (ширина области просмотра, высота области просмотра). Все события мыши и события перетаскивания изначально принимаются как координаты представления, и вам необходимо отобразить эти координаты на сцену, чтобы взаимодействовать с элементами.

Картирование координат

Часто при работе с элементами на сцене полезно отображать координаты и произвольные фигуры со сцены на элемент, от элемента к элементу или от представления к сцене. Например, когда вы щелкаете мышкой в области просмотра QGraphicsView, вы можете спросить у сцены, какой элемент находится под курсором, вызвав QGraphicsView::mapToScene(), а затем QGraphicsScene::itemAt(). Если вы хотите узнать, где в области просмотра находится элемент, вы можете вызвать QGraphicsItem::mapToScene() на элементе, а затем QGraphicsView::mapFromScene() на представлении. Наконец, если вы хотите найти элементы, которые находятся внутри эллипса области просмотра, вы можете передать QPainterPath в mapToScene(), а затем передать отображённый путь в QGraphicsScene::items().

Вы можете отображать координаты и фигуры к элементу и от элемента сцены, вызвав QGraphicsItem::mapToScene() и QGraphicsItem::mapFromScene(). Вы также можете отображать координаты на родительский элемент, вызвав QGraphicsItem::mapToParent() и QGraphicsItem::mapFromParent(), или между элементами, вызвав QGraphicsItem::mapToItem() и QGraphicsItem::mapFromItem(). Все функции отображения могут отображать точки, прямоугольники, многоугольники и пути.

Те же функции отображения доступны в представлении для отображения на сцену и со сцены. QGraphicsView::mapFromScene() и QGraphicsView::mapToScene(). Чтобы отобразить из представления на элемент, сначала отобразите на сцену, а затем отобразите со сцены на элемент.

Основные возможности

Масштабирование и поворот

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

Вот пример того, как реализовать слоты масштабирования и поворота в подклассе QGraphicsView:

class View : public QGraphicsView
{
Q_OBJECT
    ...
public slots:
    void zoomIn() { scale(1.2, 1.2); }
    void zoomOut() { scale(1 / 1.2, 1 / 1.2); }
    void rotateLeft() { rotate(-10); }
    void rotateRight() { rotate(10); }
    ...
};

Слоты можно подключить к QToolButtons с включённым автоповтором.

QGraphicsView сохраняет центр представления выровненным при преобразовании представления.

См. также пример Упругие узлы для кода, демонстрирующего, как реализовать базовые функции масштабирования.

Печать

Графическое представление обеспечивает однострочную печать через свои функции отрисовки, QGraphicsScene::render() и QGraphicsView::render(). Функции предоставляют одинаковый API: вы можете настроить сцену или представление для отрисовки всего или частей содержимого в любое устройство рисования, передав QPainter в любую из функций отрисовки. Этот пример показывает, как распечатать всю сцену на целую страницу, используя QPrinter.

QGraphicsScene scene;
scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));

QPrinter printer;
if (QPrintDialog(&printer).exec() == QDialog::Accepted) {
    QPainter painter(&printer);
    painter.setRenderHint(QPainter::Antialiasing);
    scene.render(&painter);
}

Разница между функциями отрисовки сцены и представления заключается в том, что одна работает в координатах сцены, а другая — в координатах представления. QGraphicsScene::render() часто предпочтительнее для печати целых фрагментов сцены без преобразований, например, для построения геометрических данных или печати текстового документа. QGraphicsView::render(), с другой стороны, подходит для создания снимков экрана; его стандартное поведение заключается в отрисовке точного содержимого области просмотра с помощью предоставленного художника.

QGraphicsScene scene;
scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));

QPixmap pixmap;
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
scene.render(&painter);
painter.end();

pixmap.save("scene.png");

Когда размеры исходных и целевых областей не совпадают, содержимое исходной области растягивается для соответствия целевой области. Передавая Qt::AspectRatioMode в используемую функцию отрисовки, вы можете выбрать сохранение или игнорирование соотношения сторон сцены при растягивании содержимого.

Перетаскивание

Поскольку QGraphicsView косвенно наследуется от QWidget, он уже предоставляет ту же функциональность перетаскивания, что и QWidget. Кроме того, для удобства, система графического представления предоставляет поддержку перетаскивания для сцены и для каждого элемента. Поскольку представление получает перетаскивание, оно преобразует события перетаскивания в QGraphicsSceneDragDropEvent, который затем передаётся на сцену. Сцена принимает на себя планирование этого события и отправляет его первому элементу под курсором мыши, который принимает перетаскивание.

Чтобы начать перетаскивание элемента, создайте объект QDrag, передав указатель на виджет, который инициирует перетаскивание. Элементы могут быть наблюдаемыми многими представлениями одновременно, но только одно представление может начать перетаскивание. Перетаскивание в большинстве случаев инициируется нажатием или перемещением мыши, поэтому в mousePressEvent() или mouseMoveEvent() вы можете получить указатель на исходный виджет из события. Например:

void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    QMimeData *data = new QMimeData;
    data->setColor(Qt::green);

    QDrag *drag = new QDrag(event->widget());
    drag->setMimeData(data);
    drag->start();
}

Чтобы перехватить события перетаскивания для сцены, переопределите QGraphicsScene::dragEnterEvent() и те обработчики событий, которые необходимы вашей конкретной сцене, в подклассе QGraphicsItem. Более подробную информацию о перетаскивании в Графическом представлении вы можете найти в документации для каждого обработчика событий QGraphicsScene.

Элементы могут включить поддержку перетаскивания, вызвав QGraphicsItem::setAcceptDrops(). Чтобы обработать входящие события перетаскивания, переопределите QGraphicsItem::dragEnterEvent(), QGraphicsItem::dragMoveEvent(), QGraphicsItem::dragLeaveEvent() и QGraphicsItem::dropEvent().

См. также пример Робот перетаскивания и сбрасывания для демонстрации поддержки перетаскивания и сбрасывания в Графическом представлении.

Курсоры и всплывающие подсказки

Как и QWidget, QGraphicsItem также поддерживает курсоры (QGraphicsItem::setCursor()), и всплывающие подсказки (QGraphicsItem::setToolTip()). Курсоры и всплывающие подсказки активируются QGraphicsView, когда курсор мыши входит в область элемента (обнаружено вызовом QGraphicsItem::contains()).

Вы также можете установить стандартный курсор непосредственно в представлении, вызвав QGraphicsView::setCursor().

См. также пример Робот перетаскивания и сбрасывания для кода, реализующего обработку всплывающих подсказок и формы курсора.

Анимация

Графическое представление поддерживает анимацию на нескольких уровнях. Вы можете легко собрать анимацию, используя фреймворк анимации. Для этого ваши элементы должны наследоваться от QGraphicsObject и ассоциировать QPropertyAnimation с ними. QPropertyAnimation позволяет анимировать любое свойство QObject.

Другой вариант — создать пользовательский элемент, наследуемый от QObject и QGraphicsItem. Элемент может настроить собственные таймеры и управлять анимацией с помощью инкрементных шагов в QObject::timerEvent().

Третий вариант, который в основном доступен для совместимости с QCanvas в Qt 3, — это продвижение сцены вызовом QGraphicsScene::advance(), который в свою очередь вызывает QGraphicsItem::advance().

Отрисовка OpenGL

Для включения отрисовки OpenGL просто задайте новый QGLWidget в качестве области просмотра QGraphicsView, вызвав QGraphicsView::setViewport(). Если вам нужен OpenGL с сглаживанием, вам нужна поддержка буфера сэмплов OpenGL (см. QGLFormat::sampleBuffers()).

Пример:

QGraphicsView view(&scene);
view.setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));

Группы элементов

Сделав один элемент дочерним другому, вы можете достичь самой важной функции группирования элементов: элементы будут перемещаться вместе, и все преобразования будут передаваться от родителя к дочернему.

Кроме того, QGraphicsItemGroup — это специальный элемент, который объединяет обработку событий дочерних элементов с удобным интерфейсом для добавления и удаления элементов в группу и из неё. Добавление элемента в QGraphicsItemGroup сохранит исходное положение и преобразование элемента, в то время как переопределение родителя для элементов обычно приводит к тому, что дочерний элемент изменяет своё положение относительно нового родителя. Для удобства вы можете создать QGraphicsItemGroup через сцену, вызвав QGraphicsScene::createItemGroup().

Виджеты и макеты

Qt 4.4 добавило поддержку геометрии и элементов с учетом компоновки через QGraphicsWidget. Этот специальный базовый элемент похож на QWidget, но в отличие от QWidget, он не наследуется от QPaintDevice, а от QGraphicsItem. Это позволяет создавать полные виджеты с событиями, сигналами и слотами, подсказками размера и политиками, а также управлять геометрией виджетов в макетах через QGraphicsLinearLayout и QGraphicsGridLayout.

QGraphicsWidget

Основываясь на возможностях и небольшом объёме QGraphicsItem, QGraphicsWidget предоставляет лучшее из обоих миров: дополнительные функциональные возможности от QWidget, такие как стиль, шрифт, палитра, направление макета и его геометрия, а также независимость от разрешения и поддержка преобразований от QGraphicsItem. Поскольку Вид графики использует реальные координаты вместо целых чисел, функции геометрии QGraphicsWidget также работают с QRectF и QPointF. Это также относится к прямоугольникам рамки, отступам и интервалам. Например, при использовании QGraphicsWidget нередко задаются отступы содержимого (0.5, 0.5, 0.5, 0.5). Можно создавать как дочерние виджеты, так и «главные» окна; в некоторых случаях теперь можно использовать Вид графики для расширенных приложений MDI.

Поддерживаются некоторые свойства QWidget, включая флаги и атрибуты окна, но не все. Для получения полного обзора поддерживаемых и неподдерживаемых функций следует обратиться к документации класса QGraphicsWidget. Например, вы можете создать декорированные окна, передав флаг окна Qt::Window конструктору QGraphicsWidget, но в настоящее время Вид графики не поддерживает флаги Qt::Sheet и Qt::Drawer, которые распространены в macOS.

QGraphicsLayout

QGraphicsLayout является частью фреймворка компоновки второго поколения, разработанного специально для QGraphicsWidget. Его API очень похож на API QLayout. Вы можете управлять виджетами и подмакетами внутри QGraphicsLinearLayout и QGraphicsGridLayout. Также можно легко написать свой собственный макет, унаследовав его от QGraphicsLayout, или добавить свои элементы QGraphicsItem в макет, написав адаптер-подкласс QGraphicsLayoutItem.

Встроенная поддержка виджетов

Вид графики обеспечивает бесшовную поддержку встраивания любого виджета в сцену. Вы можете встраивать простые виджеты, такие как QLineEdit или QPushButton, сложные виджеты, такие как QTabWidget, и даже целые главные окна. Для встраивания виджета в сцену просто вызовите QGraphicsScene::addWidget() или создайте экземпляр QGraphicsProxyWidget для ручного встраивания виджета.

С помощью QGraphicsProxyWidget Вид графики может глубоко интегрировать функции клиентского виджета, включая его курсоры, всплывающие подсказки, события мыши, планшета и клавиатуры, дочерние виджеты, анимации, всплывающие окна (например, QComboBox или QCompleter), фокус ввода и активацию виджета. QGraphicsProxyWidget даже интегрирует порядок ввода встроенного виджета, так что вы можете переключаться на встроенные виджеты. Вы даже можете встроить новый QGraphicsView в свою сцену для предоставления сложных вложенных сцен.

При преобразовании встроенного виджета Вид графики гарантирует, что виджет преобразуется независимо от разрешения, что позволяет шрифтам и стилю оставаться чёткими при масштабировании. (Обратите внимание, что эффект независимости от разрешения зависит от стиля.)

Производительность

Инструкции с плавающей точкой

Для точного и быстрого применения преобразований и эффектов к элементам Вид графики предполагает, что оборудование пользователя способно обеспечить приемлемую производительность для инструкций с плавающей точкой.

Многие рабочие станции и настольные компьютеры оснащены подходящим оборудованием для ускорения такого рода вычислений, но некоторые встраиваемые устройства могут предоставлять только библиотеки для обработки математических операций или эмуляции инструкций с плавающей точкой в программном обеспечении.

В результате некоторые типы эффектов могут быть медленнее, чем ожидалось, на некоторых устройствах. Возможно, можно компенсировать потерю производительности, внеся оптимизации в других областях; например, используя OpenGL для рендеринга сцены. Однако любые такие оптимизации могут сами по себе привести к снижению производительности, если они также зависят от наличия оборудования с плавающей точкой.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/graphicsview.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API