Фреймворк графического представления
Графическое представление предоставляет поверхность для управления и взаимодействия с большим количеством пользовательских 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, QTransform());
QGraphicsScene's архитектура распространения событий планирует события сцены для доставки элементам, а также управляет распространением между элементами. Если сцена получает событие нажатия мыши в определенной позиции, сцена передает событие тому элементу, который находится в этой позиции.
QGraphicsScene также управляет определенными состояниями элементов, такими как выделение и фокус элемента. Вы можете выделять элементы на сцене, вызывая QGraphicsScene::setSelectionArea(), передавая произвольную форму. Эта функциональность также используется в качестве основы для выделения резиновой лентой в QGraphicsView. Чтобы получить список всех выделенных в данный момент элементов, вызовите QGraphicsScene::selectedItems(). Другое состояние, управляемое QGraphicsScene, — это наличие или отсутствие фокуса ввода с клавиатуры у элемента. Вы можете установить фокус на элемент, вызвав QGraphicsScene::setFocusItem() или QGraphicsItem::setFocus или получить текущий элемент фокуса, вызвав QGraphicsScene::focusItem().
Наконец, QGraphicsScene позволяет вам рендерить части сцены в устройство рисования с помощью функции QGraphicsScene::render(). Вы можете узнать больше об этом в разделе «Печать» в этой документации.
Представление
QGraphicsView предоставляет виджет представления, который визуализирует содержимое сцены. Вы можете прикрепить несколько представлений к одной сцене, чтобы предоставить несколько областей просмотра одного и того же набора данных. Виджет представления — это область прокрутки, и предоставляет полосы прокрутки для навигации по большим сценам. Чтобы включить поддержку OpenGL, вы можете установить QOpenGLWidget в качестве области просмотра, вызвав 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 для кода, демонстрирующего, как реализовать базовые возможности масштабирования.
Печать
Graphics View предоставляет печать одной строкой через свои функции отрисовки, QGraphicsScene::render() и QGraphicsView::render(). Функции предоставляют одинаковый API: вы можете заставить сцену или представление отрисовывать все или части своего содержимого в любой устройстве отрисовки, передав QPainter любой из функций отрисовки. Этот пример показывает, как напечатать всю сцену на всю страницу, используя QPrinter.
QGraphicsScene scene;
QPrinter printer;
scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black), QBrush(Qt::green));
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. Кроме того, для удобства фреймворк Graphics View предоставляет поддержку перетаскивания для сцены и для каждого элемента. По мере получения представления перетаскивания, оно преобразует события перетаскивания в QGraphicsSceneDragDropEvent, которое затем пересылается на сцену. Сцена берет на себя планирование этого события и отправляет его первому элементу под курсором мыши, который принимает перетаскивание.
Чтобы начать перетаскивание из элемента, создайте объект QDrag, передав указатель на виджет, который инициирует перетаскивание. Элементы могут наблюдаться многими представлениями одновременно, но только одно представление может инициировать перетаскивание. Перетаскивания обычно запускаются в результате нажатия или перемещения мыши, поэтому в методах mousePressEvent() или mouseMoveEvent() вы можете получить указатель на исходный виджет из события. Например:
void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
QMimeData *data = new QMimeData;
QDrag *drag = new QDrag(event->widget());
drag->setMimeData(data);
drag->exec();
} Чтобы перехватить события перетаскивания для сцены, переопределите QGraphicsScene::dragEnterEvent() и обработчики событий, необходимые для вашей конкретной сцены, в подклассе QGraphicsItem. Вы можете узнать больше о перетаскивании в Graphics View в документации для каждого из обработчиков событий QGraphicsScene.
Элементы могут включить поддержку перетаскивания, вызвав QGraphicsItem::setAcceptDrops(). Для обработки входящего перетаскивания переопределите QGraphicsItem::dragEnterEvent(), QGraphicsItem::dragMoveEvent(), QGraphicsItem::dragLeaveEvent() и QGraphicsItem::dropEvent().
См. также пример Drag and Drop Robot для демонстрации поддержки Graphics View для операций перетаскивания.
Курсоры и всплывающие подсказки
Как и QWidget, QGraphicsItem также поддерживает курсоры (QGraphicsItem::setCursor()) и всплывающие подсказки (QGraphicsItem::setToolTip()). Курсоры и всплывающие подсказки активируются QGraphicsView при входе курсора мыши в область элемента (обнаружено вызовом QGraphicsItem::contains()).
Вы также можете установить курсор по умолчанию непосредственно в представлении, вызвав QGraphicsView::setCursor().
См. также пример Drag and Drop Robot для кода, реализующего обработку всплывающих подсказок и формы курсора.
Анимация
Graphics View поддерживает анимацию на нескольких уровнях. Вы можете легко создать анимацию, используя фреймворк анимации. Для этого вам нужно, чтобы ваши элементы унаследовали от QGraphicsObject и ассоциировать QPropertyAnimation с ними. QPropertyAnimation позволяет анимировать любое свойство QObject.
Другой вариант — создать пользовательский элемент, наследующий от QObject и QGraphicsItem. Элемент может настроить собственные таймеры и управлять анимацией с помощью инкрементных шагов в QObject::timerEvent().
Третий вариант, который в основном доступен для совместимости с QCanvas в Qt 3, — это продвигать сцену, вызвав QGraphicsScene::advance(), которое в свою очередь вызывает QGraphicsItem::advance().
Отрисовка с OpenGL
Для включения отрисовки с OpenGL просто установите новый QOpenGLWidget в качестве области просмотра QGraphicsView, вызвав QGraphicsView::setViewport(). Если вы хотите OpenGL с сглаживанием, вам нужно установить QSurfaceFormat с необходимым количеством сэмплов (см. QSurfaceFormat::setSamples()).
Пример:
QGraphicsView view(&scene); QOpenGLWidget *gl = new QOpenGLWidget(); QSurfaceFormat format; format.setSamples(4); gl->setFormat(format); view.setViewport(gl);
Группы элементов
Сделав один элемент дочерним другому, вы можете получить наиболее существенную функцию группирования элементов: элементы будут перемещаться вместе, и все преобразования распространяются от родителя к дочерним элементам.
Кроме того, 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 очень похож на 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-6.2/graphicsview.html