You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 08:12:32