当前位置: 首页 > news >正文

QGraphicsObject学习

QGraphicsObject是 Qt 中 ​图形视图框架(Graphics View Framework)​​ 里的一个类,它本质上是:

​“既能显示、又能响应事件、还能做动画的图元基类”​

可以把它理解成:

  • 既有QGraphicsItem图形绘制能力​(形状、颜色、变换等);

  • 又有QObject信号槽机制、属性系统、定时器、父子对象管理等功能。


一、它在框架中的位置

Qt 图形视图框架三层结构大致是:

  1. 场景 QGraphicsScene​:舞台,负责管理所有图元。

  2. 视图 QGraphicsView​:摄像机,负责把场景渲染到窗口部件上。

  3. 图元 QGraphicsItem​:舞台上的演员,比如矩形、椭圆、图片等。

在这之上,​QGraphicsObject= QGraphicsItem + QObject​:

  • 继承自QGraphicsItem(绘图与几何);

  • 同时继承自QObject(事件、信号槽、属性绑定)。


二、主要用途

当你需要一个可交互、可动画、可绑定属性的图形元素时,就用QGraphicsObject或其子类。

典型用途包括:

  1. 自定义可交互控件

    比如在场景中放一个按钮、滑块、开关图标:

    • 继承QGraphicsObject,在里面用paint()画出按钮外观;

    • 重写mousePressEventhoverEnterEvent等实现点击、悬停反馈;

    • 用信号槽和外部业务逻辑通信。

  2. 带动画的图形元素

    例如:

    • 游戏中角色、子弹、特效;

    • 仪表盘指针旋转、进度条填充动画;

      可以利用QObject::startTimer或 Qt 动画框架(QPropertyAnimation),配合setPossetRotationsetScale等实时刷新位置或外观。

  3. 与外部数据绑定

    因为继承了QObject,可以给自定义属性加Q_PROPERTY,然后用:

    Q_PROPERTY(qreal progress READ progress WRITE setProgress NOTIFY progressChanged)

    再用QPropertyAnimation或直接绑定 UI 控件,让图形随数据自动变化。


三、和普通 QGraphicsItem 的区别

特性

QGraphicsItem

QGraphicsObject

是否继承 QObject

是否支持信号槽

不支持

支持

是否支持 Q_PROPERTY

不支持

支持

是否支持定时器/事件循环

只处理图形事件

可正常使用timerEvent、信号槽等

使用场景

静态/简单图元,如矩形、线条

需要逻辑、动画、数据绑定的复杂图元

简单记:

  • 只是画个框、圆、图片,用QGraphicsItem就够了;

  • 要“能动、能点、能发信号、能跟数据联动”,就选QGraphicsObject


四、一个最小示例思路

class MyItem : public QGraphicsObject { Q_OBJECT public: // 必须实现的两个函数 QRectF boundingRect() const override { return QRectF(0, 0, 100, 100); } void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) override { painter->setBrush(Qt::lightGray); painter->drawEllipse(boundingRect()); } signals: void clicked(); protected: void mousePressEvent(QGraphicsSceneMouseEvent *) override { emit clicked(); // 发出信号给外部 } };

这样既能在场景中显示一个灰色圆形,又能响应鼠标点击并通知别的组件。

http://www.jsqmd.com/news/444421/

相关文章:

  • 深入解析:决策树三大核心算法详解:ID3、C4.5与CART
  • 2026年北京遗产继承律师推荐:从专业度到服务体验的深度测评 - 小白条111
  • Redis深度避坑:从命令陷阱到主从复制的生产级实战指南
  • 岐金兰AI元人文的思想史意义再定位
  • 软件研发 --- 学Python
  • AI能对.NET项目开发起到哪些作用
  • 【音乐播放器推荐】Dopamine官方下载:全格式支持,本地听歌神器(附资源包) - xiema
  • 2026年北京房产继承律师推荐测评:从专业度到服务体验的5大核心维度解析 - 小白条111
  • 2026年北京海淀/朝阳/昌平离婚律师推荐:从专业能力到服务体验的深度测评 - 小白条111
  • LNP 脂质纳米颗粒递送系统:原理、结构与生物医药前沿应用
  • 完整教程:Moltbot高权限架构与“最小权限”安全原则的深度冲突剖析
  • 巴菲特的创新能力评估:量子创业生态系统的价值创造
  • 2026年北京海淀/朝阳/昌平律师事务所推荐:从专业深度到服务体验的实战测评 - 小白条111
  • MYSQL基础(大模型基础准备3/3)
  • 网络基础-网络的重要性(一)
  • 网络基础-认识网络以及重要性(一)
  • Flutter 三方库 sidekick 的鸿蒙化适配指南 - 掌控终端辅助、CLI 资产实战、鸿蒙级精密工程专家
  • 2026年苏州工业级钼酸盐及EDTA系列化工品服务商TOP5推荐:钼酸钠、EDTA二钠、EDTA四钠、工业级化工品、从研发生产到产销赋能的务实之选 - 海棠依旧大
  • 用 manus 做了几个网站 - AI
  • Malgolab 开发笔记
  • Unsorted bin
  • ELK
  • 计算机网络学习笔记
  • 哪家保险经纪公司重疾险好?元保用实力给出最优答案 - 速递信息
  • MAS多智能体系统:从入门到实战的全方位解析
  • 深入解析:【C++】C++智能指针
  • ★★枚举法求最大公约数
  • 完整教程:2026年阿里云五种方案快速部署 OpenClaw(Clawdbot)详细教程
  • 【攻防世界】Whisper
  • kotlin基础(3)