效果图:
原理:使用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);
}
}