Spec-Zone.ru › Qt 5.14

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

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

Классы в фреймворке графического просмотра

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

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, если определённая точка находится внутри вашего элемента, и ложь в противном случае, принимает аргумент точки в координатах элемента. Аналогично, прямоугольник ограничителя и форма элемента задаются в координатах элемента.

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

Координаты дочерних элементов относительны к координатам родительского элемента. Если дочерний элемент не преобразован, разница между координатами дочернего элемента и родительского элемента такая же, как расстояние между элементами в координатах родительского элемента. Например: если дочерний элемент, который не преобразован, расположен точно в центре родительского элемента, тогда системы координат обоих элементов будут идентичны. Однако если положение дочернего элемента (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 сохраняет центр представления выровненным при преобразовании представления.

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

Печать

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

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

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

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

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

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

pixmap.save("scene.png");

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

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

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

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

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

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

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

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

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

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

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

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

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

Анимация

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

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

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

Отображение с OpenGL

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

Пример:

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

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

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

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

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

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

QGraphicsWidget

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

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

QGraphicsLayout

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

Поддержка встраиваемых виджетов

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

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

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

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

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

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

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

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

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

Spec-Zone.ru

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