Фреймворк для графических представлений
Графический просмотр предоставляет поверхность для управления и взаимодействия с большим количеством пользовательских 2D графических элементов и виджет просмотра для визуализации элементов с поддержкой масштабирования и поворота.
Фреймворк включает архитектуру распространения событий, которая позволяет точные взаимодействия с двойной точностью для элементов на сцене. Элементы могут обрабатывать события нажатия клавиш, нажатия, перемещения, отпускания и двойного щелчка мыши, а также отслеживать движение мыши.
Графический просмотр использует дерево BSP (Binary Space Partitioning) для очень быстрого обнаружения элементов, и в результате может визуализировать большие сцены в реальном времени, даже с миллионами элементов.
Графический просмотр был представлен в 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().
Классы в фреймворке графического просмотра
Эти классы обеспечивают основу для создания интерактивных приложений.
Общий базовый класс для всех элементов пути |
|
Представляет якорь между двумя элементами в QGraphicsAnchorLayout |
|
Макет, где можно привязать виджеты друг к другу в представлении графики |
|
Базовый класс для всех графических эффектов |
|
Эллипс, который можно добавить в QGraphicsScene |
|
Сетка макета для управления виджетами в представлении графики |
|
Базовый класс для всех графических элементов в QGraphicsScene |
|
Контейнер, который обрабатывает группу элементов как один элемент |
|
Базовый класс для всех макетов в представлении графики |
|
Можно унаследовать, чтобы позволить вашим пользовательским элементам управляться макетами |
|
Линия, которую можно добавить в QGraphicsScene |
|
Горизонтальный или вертикальный макет для управления виджетами в представлении графики |
|
Базовый класс для всех графических элементов, требующих сигналов, слотов и свойств |
|
Элемент пути, который можно добавить в QGraphicsScene |
|
Элемент пиксельной карты, который можно добавить в QGraphicsScene |
|
Многоугольник, который можно добавить в QGraphicsScene |
|
Прокси-слой для встраивания QWidget в QGraphicsScene |
|
Прямоугольник, который можно добавить в QGraphicsScene |
|
Поверхность для управления большим количеством 2D графических элементов |
|
События контекстного меню в рамках графического представления |
|
События перетаскивания и перемещения в рамках графического представления |
|
Базовый класс для всех событий, связанных с графическим представлением |
|
События, когда запрашивается всплывающая подсказка |
|
События наведения курсора в рамках графического представления |
|
События мыши в рамках графического представления |
|
События перемещения виджетов в рамках графического представления |
|
События изменения размера виджетов в рамках графического представления |
|
События колеса мыши в рамках графического представления |
|
Простой элемент пути текста, который можно добавить в QGraphicsScene |
|
QGraphicsItem, который можно использовать для рендеринга содержимого файлов SVG |
|
Элемент текста, который можно добавить в QGraphicsScene для отображения форматированного текста |
|
Абстрактный базовый класс для построения расширенных преобразований QGraphicsItems |
|
Виджет для отображения содержимого QGraphicsScene |
|
Базовый класс для всех элементов виджетов в QGraphicsScene |
|
Используется для описания параметров, необходимых для рисования QGraphicsItem |
Система координат представления графики
Представление графики основано на декартовой системе координат; положение и геометрия элементов на сцене представлены наборами из двух чисел: координатой 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 с включённым автоповтором.
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/archives/qt-5.11/graphicsview.html