Qt Graphics View Framework 简介

在 Qt 中,QGraphicsScene 、QGraphicsView 、QGraphicsWidget 和 QGraphicsItem 是构建图形用户界面的核心类,它们共同构成了 Qt 的图形视图框架(Graphics View Framework)。这个框架提供了一个基于图元的模型/视图架构,用于管理和显示大量的自定义 2D 图形项。

QGraphicsScene

QGraphicsScene 是一个用于管理多个 QGraphicsItem 的容器。它为这些图形项提供了一个平面空间,可以在其中进行组织、管理和检索。

  • 功能:
    • 提供一个用于放置图形项的场景。
    • 管理图形项的索引和事件传播。
    • 支持图形项的分组和层次管理。
  • 特点:
    • 不是可见的,需要通过 QGraphicsView 来查看。
    • 可以包含大量的图形项。
  • 使用场景:
    • 任何需要管理和显示大量 2D 图形项的应用程序。
  • 代码示例:
cpp 复制代码
QGraphicsScene scene = new QGraphicsScene();
QGraphicsRectItem rect = scene->addRect(QRectF(0, 0, 100, 100));

QGraphicsView

QGraphicsView 是一个用于展示 QGraphicsScene 内容的视图部件。它提供了一个窗口,用户可以通过这个窗口来查看和与场景中的图形项交互。

  • 功能:
    • 显示 QGraphicsScene 的内容。
    • 支持缩放和平移操作。
    • 可以将事件传递给场景和图形项。
  • 特点:
    • 是一个可视的部件,可以直接添加到窗口中。
    • 支持 OpenGL 渲染。
  • 使用场景:
    • 任何需要可视化 2D 图形项的应用程序。
  • 代码示例:
cpp 复制代码
QGraphicsView view = new QGraphicsView(scene);
view->show();

QGraphicsWidget

QGraphicsWidget 是 QGraphicsItem 的子类,它提供了类似于 QWidget 的功能,包括布局管理和事件处理。

  • 功能:
    • 作为图形项,可以在 QGraphicsScene 中使用。
    • 支持布局和子部件。
    • 可以处理事件和绘制自定义内容。
  • 特点:
    • 结合了 QGraphicsItem 的灵活性和 QWidget 的便利性。
  • 使用场景:
    • 需要更复杂的用户界面元素和布局管理的图形视图应用程序。
  • 代码示例:
cpp 复制代码
QGraphicsWidget widget = new QGraphicsWidget();
QGraphicsLinearLayout layout = new QGraphicsLinearLayout(widget);
widget->setLayout(layout);

QGraphicsItem

QGraphicsItem 是所有图形项的基类,它提供了基本的图形项功能,如位置、大小、形状和变换。

  • 功能:
    • 定义图形项的基本属性和行为。
    • 支持父子关系和碰撞检测。
    • 可以处理事件和自定义绘制。
  • 特点:
    • 高度可定制,可以通过子类化来实现复杂的图形项。
  • 使用场景:
    • 任何需要自定义 2D 图形表示的应用程序。
  • 代码示例:
cpp 复制代码
QGraphicsItem item = new QGraphicsItem();
item->setPos(100, 100);
item->setFlag(QGraphicsItem::ItemIsMovable);

关系总结:

  • QGraphicsScene 作为容器,管理所有的 QGraphicsItem。
  • QGraphicsView 作为视图,展示 QGraphicsScene 的内容。
  • QGraphicsWidget 是 QGraphicsItem 的子类,提供更复杂的用户界面功能。
  • QGraphicsItem 是所有图形项的基础,可以是简单的图形也可以是复杂的 QGraphicsWidget。

通过这些类的组合使用,开发者可以创建复杂的 2D 图形界面,实现各种交互和视觉效果。

相关推荐
hhhjhl10 小时前
Undici 跨端三方库仓颉适配全流程
java·开发语言·ubuntu
染指111010 小时前
158.Agent-LangGraph-子图(共享状态和不共享状态模式)
开发语言·人工智能·python·ui·agent·agents
wangchunyu11411 小时前
JAVA JVM内存结构与运行时数据区
java·开发语言·jvm
slongzhang_11 小时前
linux 递归删除源码文件|递归删除目录下 *.js,但排除 *.min.js
linux·开发语言·javascript
云和数据.ChenGuang12 小时前
Python 常见特殊方法详解:__new__、__init__、__del__、__str__、__repr__ 与 __getattribute__
开发语言·人工智能·python·1024程序员节
xyouyuweizhu12 小时前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
多弗朗皮卡丘13 小时前
C++的IO流
开发语言·c++·io流·文件io流
骑着蜗牛撵大象32713 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph
itmigrate13 小时前
Rust 里的所有权误区:不是不写 clone 就叫高性能
开发语言·后端·rust
Brilliantwxx14 小时前
【Linux】 文件访问与路径解析:目录、文件名、dentry、路径缓冲与 dcache 全解析
linux·运维·服务器·开发语言·spring