Pyside的item
scene/view体系是神器.
在 PySide 的 Graphics View 框架中,所有能被放进 QGraphicsScene 的对象都继承自 QGraphicsItem。
一、3 条继承线(Qt 官方分类)
- 基本图形项(QGraphicsItem)
只提供几何形状,不能单独作为窗口控件。 - 控件项(QGraphicsWidget)
继承自 QGraphicsItem,但同时具有 QWidget 的窗口语义(布局、调色板、字体、焦点策略等)。
可嵌入普通 QWidget(见第 3 类)。 - 布局/窗口包装器
QGraphicsWidget 的配套类,用来把普通 QWidget 塞进场景,或在场景里做布局。
二、具体类与用途速览
| 大类 | 类别 | 类名 | 典型用途 / 特点 |
|---|---|---|---|
| 纯item | 基础形状 | QGraphicsRectItem | 矩形 / 圆角矩形 |
| QGraphicsEllipseItem | 椭圆 / 圆 | ||
| QGraphicsLineItem | 直线段 | ||
| QGraphicsPolygonItem | 任意多边形 | ||
| QGraphicsPathItem | 任意 QPainterPath(贝塞尔、合并形状等) | ||
| 文字 | QGraphicsSimpleTextItem | 单行纯文本,轻量 | |
| QGraphicsTextItem | 富文本、可选、可编辑,支持 HTML | ||
| 图像 | QGraphicsPixmapItem | 显示光栅图(QPixmap) | |
| QGraphicsSvgItem | 显示矢量 SVG(QtSvg 模块) | ||
| widget桥 | 提供基类 | QGraphicsWidget | 场景内的“窗口”,支持布局、样式表、焦点链 |
| QGraphicsProxyWidget | 把任何 QWidget 包装成 item 放进场景 | ||
| widget布局 | 只能布局widget桥 | QGraphicsLinearLayout | 场景内水平/垂直布局 |
| QGraphicsGridLayout | 网格布局 | ||
| 基类 | 自定义 | 继承 QGraphicsItem(或 QGraphicsObject) | 重写 paint()/boundingRect(),想画什么画什么 |
三、与场景/视图的关系
- QGraphicsScene 只是一个“无限大”的管理器,负责保存、索引、事件分发。
- QGraphicsView 负责把场景的一块区域渲染到屏幕,可多个视图同时观察同一 scene。
- 任何 item 都通过 scene.addItem() 或各自工厂方法(addRect、addText…)放进场景;视图会自动重绘。
- 特别注意, 工厂方法生成的不是’正常’item, 做事件链接会失效.
13太保: 形状 5 种(矩、椭、线、多边形、路径) + 文字 2 种 + 图像 2 种 + 控件 2 种 + 布局 2 种。
再加上一个“自定义”接口(继承 QGraphicsItem),足够覆盖从简单矢量图到复杂嵌套窗口的全部需求, 且框架开销非常低。
原理性要点: item不是qobject
- 没有
signal/slot - 没有
deleteLater() - 没有
setProperty()/property() - 不会被
QTimer.singleShot(0, obj, slot)这类“槽”调用
继承链
QGraphicsItem ← 纯几何/绘制对象,无信号槽,无焦点,无布局
↑
QGraphicsObject ← 在 item 基础上加入 QObject 信号槽、属性系统
↑
QGraphicsWidget ← 再加入矩形几何、布局、大小策略、焦点、调色板,像 QWidget
13太保之外
- 基础库之外, qt还有charts等库. 因此有13太保之外的item, 比如:
- QChart
- QGraphicsSvgItem
| 类 | 作用 | 典型用法 |
|---|---|---|
QGraphicsItemGroup |
把若干 item 打包成整体 | 一页内容整体 hide/show |
QGraphicsWidget |
拥有几何+布局系统的 item | 自制按钮、面板、窗体 |
QGraphicsProxyWidget |
把纯 QWidget 塞进 Scene | 复用现有 QPushButton、QLineEdit 等 |
QGraphicsRectItem/EllipseItem/TextItem/PathItem |
几何图元 | 背景框、高亮框、图标 |
QGraphicsObject |
带信号槽的 item 基类 | 需要发自定义信号时继承它 |
QGraphicsLayout 家族 |
在 Scene 里做布局 | 给 QGraphicsWidget 排子控件 |