深入浅出(十三)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个文件

相关推荐
tankeven5 分钟前
最短路径问题00:dijkstra算法
c++·算法
REDcker12 分钟前
glibc、libstdc++ 与 libc++ 区别与联系
开发语言·c++
2401_8442213212 分钟前
内存对齐与缓存友好设计
开发语言·c++·算法
qiuyunoqy16 分钟前
Linux进程 --- 5(进程地址空间初识)
linux·c++·算法
计算机安禾17 分钟前
【C语言程序设计】第28篇:指针的概念与指针变量
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio
sycmancia24 分钟前
C++——智能指针类模板
开发语言·c++
问水っ44 分钟前
Qt Creator快速入门 第三版 第四章 布局管理
开发语言·qt·学习
格林威1 小时前
工业相机图像高速存储(C++版):直接IO存储方法,附Basler相机实战代码!
开发语言·c++·人工智能·数码相机·计算机视觉·视觉检测·工业相机
m0_716667071 小时前
嵌入式C++驱动开发
开发语言·c++·算法
Lenyiin1 小时前
《LeetCode 顺序刷题》51 - 60
java·c++·python·算法·leetcode·深度优先·lenyiin