Spec-Zone.ru › Qt 6.0

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

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

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

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

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 с включённым автоповтором.

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

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

Печать

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

См. также пример Робот перетаскивания и размещения для демонстрации поддержки перетаскивания и размещения Graphics View.

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

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

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

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

Анимация

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 очень похож на 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.0/graphicsview.html

Spec-Zone.ru

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