Spec-Zone.ru › Qt 5.13

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

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

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

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

QGraphicsGridLayout

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

QAbstractGraphicsShapeItem

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

QGraphicsEllipseItem

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

QGraphicsItem

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

QGraphicsItemGroup

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

QGraphicsLineItem

Линия, которую можно добавить в QGraphicsScene

QGraphicsObject

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

QGraphicsPathItem

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

QGraphicsPixmapItem

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

QGraphicsPolygonItem

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

QGraphicsRectItem

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

QGraphicsSimpleTextItem

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

QGraphicsTextItem

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

QGraphicsLayout

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

QGraphicsLayoutItem

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

QGraphicsLinearLayout

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

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

Система координат представления графики

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

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

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

При рендеринге координаты сцены представления графики соответствуют логическим координатам 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 с включенным autoRepeat.

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

См. также пример Elastic Nodes для кода, который демонстрирует, как реализовать основные функции масштабирования.

Печать

Графическое представление обеспечивает печать одной строки через свои функции рендеринга, 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().

См. также пример Drag and Drop Robot для демонстрации поддержки перетаскивания и размещения в Графическом представлении.

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

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

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

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

Анимация

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

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

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

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

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

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

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

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

Spec-Zone.ru

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