Spec-Zone.ru › Qt 5.15

Фреймворк Визуализации Графики

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

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

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

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

Темы:

Архитектура Graphics View

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

Сцена

QGraphicsScene предоставляет сцену для Graphics View. Сцена выполняет следующие задачи:

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

Сцена служит контейнером для объектов 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 является базовым классом для графических элементов в сцене. Graphics View предоставляет несколько стандартных элементов для типовых форм, таких как прямоугольники (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().

Классы в Фреймворке Визуализации Графики

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

QAbstractGraphicsShapeItem

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

QGraphicsAnchor

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

QGraphicsAnchorLayout

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

QGraphicsEffect

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

QGraphicsEllipseItem

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

QGraphicsGridLayout

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

QGraphicsItem

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

QGraphicsItemGroup

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

QGraphicsLayout

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

QGraphicsLayoutItem

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

QGraphicsLineItem

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

QGraphicsLinearLayout

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

QGraphicsObject

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

QGraphicsPathItem

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

QGraphicsPixmapItem

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

QGraphicsPolygonItem

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

QGraphicsProxyWidget

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

QGraphicsRectItem

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

QGraphicsScene

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

QGraphicsSceneContextMenuEvent

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

QGraphicsSceneDragDropEvent

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

QGraphicsSceneEvent

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

QGraphicsSceneHelpEvent

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

QGraphicsSceneHoverEvent

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

QGraphicsSceneMouseEvent

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

QGraphicsSceneMoveEvent

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

QGraphicsSceneResizeEvent

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

QGraphicsSceneWheelEvent

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

QGraphicsSimpleTextItem

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

QGraphicsSvgItem

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

QGraphicsTextItem

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

QGraphicsTransform

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

QGraphicsView

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

QGraphicsWidget

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

QStyleOptionGraphicsItem

Используется для описания параметров, необходимых для рисования 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 с включенным autoRepeat.

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

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

Печать

Представление графики обеспечивает печать одной строки через свои функции отрисовки, 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. Кроме того, для удобства, среда графического представления предоставляет поддержку перетаскивания для сцены и для каждого элемента. Когда представление получает перетаскивание, оно преобразует события перетаскивания в 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. Вы можете прочитать подробнее о перетаскивании в графическом представлении в документации по каждому из обработчиков событий 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, просто установите новый 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 очень похож на 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.15/graphicsview.html

Spec-Zone.ru

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