QWT 之 QwtPlotDirectPainter直接绘制

QwtPlotDirectPainter 是 Qwt 库中用于直接在 QwtPlot 的画布上绘制图形的一个类。它提供了一种高效的方法来实时更新图表,特别适合需要频繁更新的数据可视化应用,例如实时数据流的显示。

使用 QwtPlotDirectPainter 的主要优势在于它可以绕过 QwtPlot 的缓冲机制,直接在画布上绘制,从而提高了绘制速度和效率。这对于需要快速响应变化的应用场景(如动态曲线、动画效果等)非常有用。

使用 QwtPlotDirectPainter 追加数据

下面是一个示例代码,展示了如何使用 QwtPlotDirectPainter 来逐步追加数据到 QwtPlotCurve 上,并且实时更新图表:

示例代码:

cpp 复制代码
#include <QApplication>
#include <QwtPlot>
#include <QwtPlotCurve>
#include <QwtPlotDirectPainter>
#include <QVector>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
#include <QTimer>

class RealTimePlot : public QWidget {
    Q_OBJECT

public:
    RealTimePlot(QWidget *parent = nullptr) : QWidget(parent), m_x(0.0) {
        setupPlot();
        setupUI();
    }

private slots:
    void appendData() {
        // 创建新的数据点
        double y = qSin(m_x); // 示例:正弦波数据
        m_samples.append(QPointF(m_x, y));

        // 更新 x 值,准备下一个数据点
        m_x += 0.1;

        // 使用 QwtPlotDirectPainter 实时绘制新数据点
        if (m_samples.size() > 1) {
            QwtPlotDirectPainter painter;
            painter.drawSeries(&m_curve, m_samples.size() - 2, m_samples.size() - 1);
        }
        
        // 如果需要调整轴范围,可以在这里调用 plot->setAxisScale() 和 plot->replot()
    }

private:
    void setupPlot() {
        // 创建并配置 QwtPlot
        m_plot = new QwtPlot(this);
        m_plot->setTitle("Real-Time Plot with QwtPlotDirectPainter");

        // 创建曲线并设置其属性
        m_curve.attach(m_plot);
        m_curve.setPen(Qt::blue, 2);

        // 设置初始轴范围
        m_plot->setAxisScale(QwtPlot::xBottom, 0, 10);
        m_plot->setAxisScale(QwtPlot::yLeft, -1, 1);

        // 显示图表
        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(m_plot);
        setLayout(layout);
    }

    void setupUI() {
        // 设置定时器以定期追加数据
        QTimer *timer = new QTimer(this);
        connect(timer, &QTimer::timeout, this, &RealTimePlot::appendData);
        timer->start(50); // 每 50 毫秒追加一个数据点
    }

    QwtPlot *m_plot;
    QwtPlotCurve m_curve;
    QVector<QPointF> m_samples;
    double m_x;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    RealTimePlot plotWidget;
    plotWidget.resize(800, 600);
    plotWidget.show();

    return app.exec();
}

解释:

RealTimePlot 类:这是一个自定义的小部件,包含了一个 QwtPlot 和必要的逻辑来追加数据并使用 QwtPlotDirectPainter 实时绘制。

setupPlot 方法:初始化 QwtPlot 和 QwtPlotCurve,并设置初始的轴范围。

setupUI 方法:创建一个定时器,每 50 毫秒触发一次 appendData 槽函数。

appendData 槽函数:生成一个新的数据点,将其添加到 m_samples 中,并使用 QwtPlotDirectPainter 绘制最新的数据点。这里只绘制最后两个点之间的线段,以提高性能。

QwtPlotDirectPainter:通过 drawSeries 方法直接在画布上绘制新的数据点,而不是重新绘制整个图表。

关键点

直接绘制QwtPlotDirectPainter 提供了直接在画布上绘制的能力,避免了重新绘制整个图表的开销。

高效更新 :适用于需要频繁更新的场景,比如实时数据显示。

局部更新:你可以选择性地只绘制新增或更改的部分,而不需要刷新整个绘图区域。

相关推荐
尘中远24 天前
【Qwt 7.0 系列】快速入门与核心新特性概览 —— 更现代的 Qt 数据可视化库
qt·数据可视化·绘图·qwt·科学绘图
尘中远24 天前
【Qwt 7.0 系列】坐标轴与刻度系统 —— 刻度引擎、网格、图例与刻度朝内
qt·数据可视化·qcustomplot·qwt·工业软件·科学绘图
尘中远25 天前
【Qwt 7.0 系列】常用图表类型实战 —— 柱状图、散点图、箱线图与直方图
qt·qwt·工业软件·科学绘图
尘中远25 天前
【Qwt 7.0 系列】交互功能详解 —— 平移、缩放、坐标轴交互与数据拾取
qt·数据可视化·绘图·qcustomplot·qwt·科学绘图
尘中远25 天前
【Qwt 7.0 系列】3D 数据可视化 —— OpenGL 高性能三维绘图
qt·3d·qcustomplot·qwt·科学绘图·高性能绘图
尘中远25 天前
【Qwt 7.0 系列】总体架构解析 —— 从单体到三库模块化的演进
qt·matplotlib·绘图·qwt·科学绘图
尘中远25 天前
【Qwt 7.0 系列】高级科学图表 —— 光谱图、向量场、K线图与极坐标绘图
qt·数据可视化·qwt·工业软件·科学绘图·云图·向量场
尘中远3 个月前
Qwt 7.0 新特性介绍 — 更现代、更强大的Qt数据可视化库
qt·qwt·科学绘图·曲线图
telllong2 年前
用Qwt进行图表和数据可视化开发
c++·qt·信息可视化·qwt