QT中未手动调用的重写QGraphicsItem函数为何自动执行?
QGraphicsItem子类中boundingRect()与paint()自动调用的逻辑解析
问题描述
我是QT新手,在自定义QGraphicsItem子类CustomItem时,重写了boundingRect()和paint()函数,但未手动调用它们,却发现它们自动执行了。我猜测父类内部可能存在某种连接机制触发它们,即便默认构造函数为空,仍不清楚具体调用逻辑,希望得到解答。
自定义子类代码
class CustomItem : public QGraphicsItem{ public: QRectF boundingRect() const override{ return QRectF(0, 0, 80, 80); } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override{ Q_UNUSED(option); Q_UNUSED(widget); painter->fillRect(boundingRect(),Qt::red); } }item;
核心逻辑解答
图形视图框架的自动调度:QGraphicsItem 属于 Qt 图形视图框架的核心组件,整个渲染流程由框架自主控制。当你把 CustomItem 添加到
QGraphicsScene并通过QGraphicsView展示时,框架会自动完成以下操作:- 调用
boundingRect()获取项的边界范围,用于确定视图中需要重绘的区域,避免无意义的全量重绘; - 当判定项需要绘制,比如首次显示、窗口状态变化、项属性变更等,会自动调用
paint(),传入框架准备好的绘图上下文(QPainter)完成绘制。
- 调用
多态机制的作用:这两个函数是 QGraphicsItem 中定义的虚函数,你重写后,框架在处理
QGraphicsItem类型的对象时,会通过多态自动调用子类的实现版本,和子类构造函数是否为空没有关系——构造函数只负责初始化对象,不影响虚函数的调用逻辑。常见触发场景:
- 项被添加到关联了视图的场景中时;
- 视图窗口大小调整、最小化恢复时;
- 调用项的
update()方法主动请求重绘时; - 场景中其他项的变化导致当前项所在区域需要更新时。
内容的提问来源于stack exchange,提问作者Victor Buchenvald
相关产品推荐
相关产品推荐

