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 提供了直接在画布上绘制的能力,避免了重新绘制整个图表的开销。

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

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

相关推荐
telllong6 个月前
用Qwt进行图表和数据可视化开发
c++·qt·信息可视化·qwt
Mr.codeee1 年前
Qwt 使用QwtDial绘制钟表
qt·时钟·qwt·qwtdial
Mr.codeee1 年前
Qwt QwtPolarPlot类使用
前端·qt·qwt·qwtplot·qwtpolarplot
Mr.codeee1 年前
Qwt开发环境搭建(保姆级教程)
qt·开发环境·1024程序员节·qwt