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官方编译
-
克隆代码
bashgit clone https://github.com/opencor/qwt.git克隆后文件结构 如下:

这里
master分支即为develop分支

-
用
Qt Creator打开qwt.pro文件,可选择项目配置为:Qt_6_10_1_MSVC2022_64bitgi

-
编译后lib文件

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

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

2.2 QWT官方示例
-
示例项目目录结构
bashQwtDemo/ ├── main.cpp ├── mainwindow.h ├── mainwindow.cpp ├── mainwindow.ui ├── QwtPlotWidget.h └── QwtPlotWidget.cpp -
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} ) -
封装绘图控件封装:
QwtPlotWidget
QwtPlotWidget.hcpp#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_HQwtPlotWidget.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(); } -
主窗口实现
mainwindow.hcpp#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_Hmainwindow.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; } -
程序入口
main.cppcpp#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社区版本编译过程如下:
-
克隆代码
bashgit clone https://github.com/czyt1988/QWT.git克隆后文件结构 如下:

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

-
Vs工程配置如下

-
编译后目录如下

bin目录:

lib目录:

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