当前位置: 首页 > article >正文

QWT 之 QwtPlotDirectPainter直接绘制

QwtPlotDirectPainter 是 Qwt 库中用于直接在 QwtPlot 的画布上绘制图形的一个类。它提供了一种高效的方法来实时更新图表,特别适合需要频繁更新的数据可视化应用,例如实时数据流的显示。
使用 QwtPlotDirectPainter 的主要优势在于它可以绕过 QwtPlot 的缓冲机制,直接在画布上绘制,从而提高了绘制速度和效率。这对于需要快速响应变化的应用场景(如动态曲线、动画效果等)非常有用。

使用 QwtPlotDirectPainter 追加数据

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

示例代码:

#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 提供了直接在画布上绘制的能力,避免了重新绘制整个图表的开销。
高效更新:适用于需要频繁更新的场景,比如实时数据显示。
局部更新:你可以选择性地只绘制新增或更改的部分,而不需要刷新整个绘图区域。


http://www.kler.cn/a/457891.html

相关文章:

  • VScode 只能运行c,运行不了c++的解决问题
  • Linux -- 死锁、自旋锁
  • springboot 整合 rabbitMQ (延迟队列)
  • 通过 4 种方法将数据从 OnePlus 传输到Android
  • phpstudy2018问题(技巧)总结
  • Spring实现Logback日志模板设置动态参数
  • LeetCode430周赛T3
  • BAPI_BATCH_CHANGE在更新后不自动更新批次特征
  • 区块链安全常见的攻击——ERC777 重入漏洞 (ERC777 Reentrancy Vulnerability)【5】
  • 【每日学点鸿蒙知识】WebView事件监听、构建工具校验规则、避让区域问题、Grid布局对齐、字符串转base64
  • 【网络安全】Web安全基础- 第一节:web前置基础知识
  • ubuntu NVIDIA RTX4000 双屏显示不了
  • 2023 年 3 月 GESP C++ 二级试卷解析
  • c++入门 LESSON0
  • win系统B站播放8k视频启用HEVC编码
  • flask后端开发(2):URL与视图
  • RSA公钥私钥对在线生成工具--可生成pem,xml,raw等密钥格式
  • .net core 的循环实现
  • 2469. 温度转换
  • Docker安装体验kuboard-k8s多集群管理工具
  • 关于Promise的小测验
  • 【Rust自学】7.5. use关键字 Pt.2 :重导入与换国内镜像源教程
  • Pytest基础01: 入门demo脚本
  • Bagging方法和Dropout方法的简单解释
  • Scala语言的函数实现
  • 【Java基础面试题038】栈和队列在Java中的区别是什么?