qt折线图超出区域颜色改变

效果图:5d185167e5794f8ca01a02205c01b7ad.png

原理:使用qpainter带有的剪切功能剪切想要的区域再通过drawPath绘制上去

核心代码逻辑:

//超出报警线
            QRegion region1(0,0,canvasRect.width(),yMap.transform(80)); // 创建第一个矩形区域
            QRegion region2(0,yMap.transform(20),canvasRect.width(),canvasRect.height()-yMap.transform(20)); // 创建第二个矩形区域
            //正常数据
            QRegion region3(0, yMap.transform(70), canvasRect.width(), yMap.transform(30)-yMap.transform(70));
            //预警线
            QRegion region4(0,yMap.transform(80),canvasRect.width(),yMap.transform(70)-yMap.transform(80)); // 创建第一个矩形区域
            QRegion region5(0,yMap.transform(30),canvasRect.width(),yMap.transform(20)-yMap.transform(30));

            painter->save();
            painter->setRenderHints(QPainter::Antialiasing);
            painter->setClipRegion(QRegion(region3));
            painter->setPen(QPen(Qt::blue, 3));
            painter->drawPath(path);

            painter->setClipRegion(region1);
            painter->setPen(QPen(Qt::red, 3));
            painter->drawPath(path);

            painter->setClipRegion(region2);
            painter->setPen(QPen(Qt::red, 3));
            painter->drawPath(path);

            painter->setClipRegion(region4);
            painter->setPen(QPen(Qt::green, 3));
            painter->drawPath(path);

            painter->setClipRegion(region5);
            painter->setPen(QPen(Qt::green, 3));
            painter->drawPath(path);

代码解释:

QRegion为绘制一块矩形区域(X,Y,w,h);
x,y是从坐标的什么地方开始的,wh是绘制大小(想保留的区域范围),


painter->setClipRegion(QRegion(region3));
是使用setClipRegion来裁剪该区域

该代码只是展示如何修改折线图的逻辑,使用的哪家的库函数去找该库函数绘制

painter的方法,重写该方法这里只展示qwt的
static int qwtVerifyRange(int size, int &i1, int &i2) {
        if (size < 1)
            return 0;

        i1 = qBound(0, i1, size - 1);
        i2 = qBound(0, i2, size - 1);

        if (i1 > i2)
            qSwap(i1, i2);

        return (i2 - i1 + 1);
    }

    void drawSeries(QPainter* painter, const QwtScaleMap& xMap, const QwtScaleMap& yMap,
                    const QRectF& canvasRect, int from, int to) const override {
        const size_t numSamples = dataSize();
        if (!painter || numSamples <= 0)
            return;
        if (to < 0)
            to = numSamples - 1;

        if (qwtVerifyRange(numSamples, from, to) > 0) {
            QVector<QPointF> pointsToDraw;
            for (int i = from; i <= to; ++i) {
                QPointF mappedPoint(xMap.transform(sample(i).x()), yMap.transform(sample(i).y()));
                pointsToDraw.append(mappedPoint);
            }

            QPainterPath path;
            path.moveTo(pointsToDraw[0]);

            for (int i = 0; i < pointsToDraw.size() - 1; ++i) {
                QPointF sp = pointsToDraw[i];
                QPointF ep = pointsToDraw[i + 1];
                QPointF c1 = QPointF((sp.x() + ep.x()) / 2, sp.y());
                QPointF c2 = QPointF((sp.x() + ep.x()) / 2, ep.y());
                path.cubicTo(c1, c2, ep);
            }
            //超出报警线
            QRegion region1(0,0,canvasRect.width(),yMap.transform(80)); // 创建第一个矩形区域
            QRegion region2(0,yMap.transform(20),canvasRect.width(),canvasRect.height()-yMap.transform(20)); // 创建第二个矩形区域
            //正常数据
            QRegion region3(0, yMap.transform(70), canvasRect.width(), yMap.transform(30)-yMap.transform(70));
            //预警线
            QRegion region4(0,yMap.transform(80),canvasRect.width(),yMap.transform(70)-yMap.transform(80)); // 创建第一个矩形区域
            QRegion region5(0,yMap.transform(30),canvasRect.width(),yMap.transform(20)-yMap.transform(30));

            painter->save();
            painter->setRenderHints(QPainter::Antialiasing);
            painter->setClipRegion(QRegion(region3));
            painter->setPen(QPen(Qt::blue, 3));
            painter->drawPath(path);

            painter->setClipRegion(region1);
            painter->setPen(QPen(Qt::red, 3));
            painter->drawPath(path);

            painter->setClipRegion(region2);
            painter->setPen(QPen(Qt::red, 3));
            painter->drawPath(path);

            painter->setClipRegion(region4);
            painter->setPen(QPen(Qt::green, 3));
            painter->drawPath(path);

            painter->setClipRegion(region5);
            painter->setPen(QPen(Qt::green, 3));
            painter->drawPath(path);
        }
    }

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值