深入浅出(十三)QWT库——高稳定二维绘图

QWT库------高稳定二维绘图

  • [1. QWT简介](#1. QWT简介)
    • [1.1 QWT下载](#1.1 QWT下载)
    • [1.2 QWT特性](#1.2 QWT特性)
  • [2. QWT官方](#2. QWT官方)
    • [2.1 QWT官方编译](#2.1 QWT官方编译)
    • [2.2 QWT官方示例](#2.2 QWT官方示例)
  • [3. QWT社区](#3. QWT社区)

1. QWT简介

QWT(Qt Widgets for Technical Applications)是一个基于 Qt 的可扩展界面组件库,提供丰富的绘图与控件,包括二维图表、滑块、刻度、表盘等技术可视化组件,广泛用于工程、科学数据可视化和实时监控应用开发。

1.1 QWT下载

地址
官方网站(旧版主页) https://sourceforge.net/projects/qwt/
官方网站 https://qwt.sourceforge.io/
GitHub 源码(镜像) https://github.com/opencor/qwt
官方用户文档 https://documentation.help/Qwt/
社区维护的新版 https://github.com/czyt1988/QWT

各版本对 Qt 的支持情况

Qwt 版本 支持Qt 版本 说明 主要编译方式
Qwt 5.x Qt 4 已淘汰,不建议使用 qmake
Qwt 6.0.x Qt 4 / Qt 5 老项目常见 qmake
Qwt 6.1.x Qt 5 稳定经典版 qmake(推荐)
Qwt 6.2.x Qt 5 官方较新版本 qmake / 部分支持 CMake
Qwt 6.3.x Qt 5 / Qt 6 官方 6.3 系列,支持 Qt6(主线稳定版) CMake(推荐) / qmake
社区增强版(czyt1988/QWT) Qt 5 / Qt 6 社区维护增强版 / 国内常用 CMake / qmake

1.2 QWT特性

QWT 是 Qt 的扩展库,为 Qt Widgets 提供科学/工程应用常用的 UI 组件,比如:

  • QwtPlot:二维绘图控件
  • QwtPlotCurve:曲线图
  • QwtScaleDraw:坐标刻度
  • QwtDial、QwtKnob:电子仪表类控件
  • 各种滑块、刻度盘等辅助控件

总体来说,QWT 不仅是 绘图,还包括各种可视化控制器,是 Qt Widgets 生态下功能丰富的技术组件库。

2. QWT官方

2.1 QWT官方编译

  1. 克隆代码

    bash 复制代码
    git clone https://github.com/opencor/qwt.git

    克隆后文件结构 如下:

    这里master分支即为develop分支

  2. Qt Creator打开qwt.pro文件,可选择项目配置为:Qt_6_10_1_MSVC2022_64bit

    gi

  3. 编译后lib文件

  4. 编译后include文件 ,需要自己copy

    • classincludes文件夹内,删除classincludes.pro文件
    • src文件夹内,只保留**.h**文件
    • 共计296个文件,如下

2.2 QWT官方示例

  1. 示例项目目录结构

    bash 复制代码
    QwtDemo/
    ├── main.cpp
    ├── mainwindow.h
    ├── mainwindow.cpp
    ├── mainwindow.ui
    ├── QwtPlotWidget.h
    └── QwtPlotWidget.cpp
  2. CMakeLists.txt引用编译的库

    bash 复制代码
    #qwt 绘图库
    add_library(Qwt SHARED  IMPORTED)
    set_target_properties(Qwt PROPERTIES
        IMPORTED_IMPLIB_DEBUG "${CMAKE_SOURCE_DIR}/3rd/qwt/lib/qwtd.lib"
        IMPORTED_IMPLIB_RELEASE "${CMAKE_SOURCE_DIR}/3rd/qwt/lib/qwt.lib"
        INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/3rd/qwt/include"
    )
    target_compile_definitions(Qwt INTERFACE QWT_DLL)
    
    set(TRD_PACKAGE Qwt)
    
    target_link_libraries(${PROJECT_NAME}
        PRIVATE ${QT_PACKAGE}
        PUBLIC
            ${TRD_PACKAGE}
    )
  3. 封装绘图控件封装:QwtPlotWidget
    QwtPlotWidget.h

    cpp 复制代码
    #ifndef QWTPLOTWIDGET_H
    #define QWTPLOTWIDGET_H
    
    #include <QTimer>
    #include <qwt_plot.h>
    #include <qwt_plot_curve.h>
    
    class QwtPlotWidget : public QwtPlot {
        Q_OBJECT
    
    public:
        QwtPlotWidget(QWidget* parent = nullptr);
        void updateData();
    
    private:
        QwtPlotCurve *sinCurve;
        QwtPlotCurve *cosCurve;
    
        QVector<double> xData;
        QVector<double> sinData;
        QVector<double> cosData;
    
        QTimer timer;
    };
    
    #endif // QWTPLOTWIDGET_H

    QwtPlotWidget.cpp

    cpp 复制代码
    #include "QwtPlotWidget.h"
    #include <cmath>
    
    QwtPlotWidget::QwtPlotWidget(QWidget *parent) : QwtPlot(parent) {
        setTitle("实时正弦/余弦曲线");
        setAxisTitle(QwtPlot::xBottom, "X");
        setAxisTitle(QwtPlot::yLeft, "Y");
    
        // 创建两个曲线
        sinCurve = new QwtPlotCurve("Sine");
        cosCurve = new QwtPlotCurve("Cosine");
    
        sinCurve->attach(this);
        cosCurve->attach(this);
    
        // 初始化数据
        for (int i = 0; i < 360; ++i)  {
            double rad = qDegreesToRadians((double)i);
            xData.push_back(i);
            sinData.push_back(std::sin(rad));
            cosData.push_back(std::cos(rad));
        }
    
        sinCurve->setSamples(xData, sinData);
        cosCurve->setSamples(xData, cosData);
    
        replot();
    
        // 定时器
        connect(&timer, &QTimer::timeout, this, &QwtPlotWidget::updateData);
        timer.start(100); // 100 ms 更新
    }
    
    void QwtPlotWidget::updateData() {
        std::rotate(sinData.begin(), sinData.begin() + 1, sinData.end());
        std::rotate(cosData.begin(), cosData.begin() + 1, cosData.end());
    
        sinCurve->setSamples(xData, sinData);
        cosCurve->setSamples(xData, cosData);
    
        replot();
    }
  4. 主窗口实现
    mainwindow.h

    cpp 复制代码
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    class QwtPlotWidget;
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    private:
        Ui::MainWindow *ui;
        QwtPlotWidget *plot;
    };
    
    #endif // MAINWINDOW_H

    mainwindow.cpp

    cpp 复制代码
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "QwtPlotWidget.h"
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow) {
        ui->setupUi(this);
    
        plot = new QwtPlotWidget(ui->plotContainer);
        plot->setGeometry(ui->plotContainer->rect());
    }
    
    MainWindow::~MainWindow() {
        delete ui;
    }
  5. 程序入口
    main.cpp

    cpp 复制代码
    #include "mainwindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[]) {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        return a.exec();
    }

3. QWT社区

注意:QWT社区版采用CMake方式,且编译后的文件如官方版本存在出入,可根据实际情况自我选择。

QWT社区版本编译过程如下:

  1. 克隆代码

    bash 复制代码
    git clone https://github.com/czyt1988/QWT.git

    克隆后文件结构 如下:

  2. 使用CMake GUI 打开工程,并进行如下配置

  3. Vs工程配置如下

  4. 编译后目录如下

    bin目录:

    lib目录:

    **include/qwt目录:**共325个文件

相关推荐
无忧.芙桃1 小时前
AVL树的实现
数据结构·c++
遥望九龙湖1 小时前
打包动态库
开发语言·c++·visualstudio
tankeven2 小时前
HJ101 排序
c++·算法
不想看见4042 小时前
01 Matrix 基本动态规划:二维--力扣101算法题解笔记
c++·算法·leetcode
麻瓜pro2 小时前
【迭代】高性能c++实时对话系统e2e_voice
开发语言·c++·onnxruntime·端到端语音
特种加菲猫2 小时前
深入理解string:通过模拟实现探讨其内部机制
c++
A星空1232 小时前
二、交叉编译工具链(arm-linux-gnueabihf-gcc)安装与验证,搭建 TFTP+NFS 服务,调试开发板网络连通性;
linux·c++·驱动开发·单片机·嵌入式硬件
郝学胜-神的一滴3 小时前
Effective Modern C++ 条款40:深入理解 Atomic 与 Volatile 的多线程语义
开发语言·c++·学习·算法·设计模式·架构
骇城迷影3 小时前
代码随想录:二叉树篇(中)
数据结构·c++·算法·leetcode