QT 5.1 构造函数向场景添加多边形仅显示最后一个问题
问题原因
自定义的tranzicija类继承自QGraphicsPolygonItem,该类原生仅支持持有并渲染单个多边形。构造函数中多次调用setPolygon()时,每次调用都会覆盖上一次设置的多边形数据,最终实例中仅保留最后一次赋值的pol6,因此场景中只会显示第6个多边形。
解决方案
改动最小的实现方式是调整tranzicija的继承逻辑,不要让它直接作为单个多边形图元,而是作为管理所有连线多边形的父图元,重写必要的绘制方法统一渲染所有多边形,具体实现如下:
- 修改
tranzicija的头文件,将继承类从QGraphicsPolygonItem改为QGraphicsItem,声明必须重写的boundingRect()和paint()方法:
#include <QGraphicsItem> #include <QPolygonF> #include <QPen> class tranzicija : public QGraphicsItem { public: tranzicija(QGraphicsItem *parent = nullptr); QRectF boundingRect() const override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; private: QPolygonF pol1, pol2, pol3, pol4, pol5, pol6; QPen linePen; };
- 修改
tranzicija的构造函数及重写方法实现,不要反复调用setPolygon(),而是在paint()方法中统一绘制所有多边形:
tranzicija::tranzicija(QGraphicsItem *parent) : QGraphicsItem(parent) { linePen = QPen(Qt::green, 7); // 初始化所有多边形点位 pol1 << QPoint(135,135) << QPoint(190,190); pol2 << QPoint(280,280) << QPoint(340,340); pol3 << QPoint(415,341) << QPoint(480,276); pol4 << QPoint(545,205) << QPoint(600,150); pol5 << QPoint(300,250) << QPoint(430,250); pol6 << QPoint(310,215) << QPoint(435,215); } QRectF tranzicija::boundingRect() const { // 返回覆盖所有多边形的外接矩形,供场景计算渲染区域 return QRectF(130, 130, 480, 220); } void tranzicija::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option); Q_UNUSED(widget); painter->setPen(linePen); // 逐个绘制所有多边形 painter->drawPolygon(pol1); painter->drawPolygon(pol2); painter->drawPolygon(pol3); painter->drawPolygon(pol4); painter->drawPolygon(pol5); painter->drawPolygon(pol6); }
dialog.cpp中的实例化和添加场景的代码不需要修改,保持原有写法即可:
tranzicija *obj = new tranzicija(); scene->addItem(obj);
如果你不想重写
paint和boundingRect方法,也可以在tranzicija构造函数中创建6个独立的QGraphicsPolygonItem对象,分别设置多边形和画笔后调用setParentItem(this)将它们设为当前对象的子项,父项添加到场景时所有子项会自动被渲染,效果完全一致。以上写法完全兼容Qt 5.1版本。
内容的提问来源于stack exchange,提问作者Don Marquez
相关产品推荐
相关产品推荐

