上两篇分别记录了Qt的二维图表charts和三维图表Data Visualization,我们已经有感于它的强大和方便,但是我还是想写一写我使用了N年之久的qwt,一款强大的第三库方Qt库表库,它支持从Qt4.4到Qt5的所有版本,具有丰富的图表类,在那个Qt Charts和Data Visualization还是收费内容的时代,真的为开发人员提供了很大的帮助。

下载与安装

本篇笔记涉及的qwt是qwt官方6.1.3版本,Qt版本是Qt5.9.7。可以到官网下载:

http://www.sourceforge.net/projects/qwt/files

下载到的是源码,qwt并不提供编译好的库文件。于是我们需要做的第一件事就是结合本地的qt版本进行编译。我们下载到的zip压缩包解压缩到某一目录下,比如:C:/qwt-6.1.3/。打开qwtconfig.pri工程文件对工程进行配置,主要需要关系安装路径:

Install paths下有QWT_INSTALL_PREFIX    = C:/Qwt-$$QWT_VERSION字段,可以改为自己的安装路径。其他的可以不改,如果你确实只想编译其中的部分控件功能,可以在下面的QWT_CONFIG字段进行删减。

简单的配置或是不做任何配置后,用Qt Creator打开qwt.pro工程,用本地的编译器configure之后直接构建就好了。如果你用命令行的话,不论是在windows还是在linux下都类似:

1.qmake qwt.pro

2.nmake (windows MSVC)或make(linux)

3.nmake install(windows MSVC)或sudo make install(linux)

生成了lib文件夹,内含Release下使用的qwt.lib qwt.dll和debug模式下使用的qwtd.lib qwtd.dll文件。建议直接拷贝到安装目录下C:/qwt-6.1.3/。在具体使用时可以在VS中设置该lib路径,在windows环境变量中添加path中dll的路径,或将这些库文件拷贝到工程目录下即可使用。当然,还需要设置include的路径,即C:\qwt-6.1.3\include。

常用类汇总

QwtAbstractScale: 包含刻度尺的所有类的抽象基类

QwtAbstractScaleDraw: 绘制刻度尺的抽象基类

QwtAbstractSlider: 滑块部件的抽象基类

QwtAlphaColorMap: 可以改变颜色的alpha值

QwtAnalogClock: 时钟的模拟类

QwtArrayData: 包含2个QwtArray<double>实例的数据类

QwtArrowButton: 箭头按钮

QwtClipper: 剪贴板类

QwtColorMap: 提供数值到颜色的映射功能

QwtCompass: 指南针部件

QwtCompassMagnetNeedle: 指南针部件的磁针

QwtCompassRose: 罗盘部件的抽象基类

QwtCompassWindArrow: 风向标的指示器

QwtPlot: 地基容器,里面可放其他对象

QwtPlotItem: 负责控制绘图数据的产生和传递,并绘制一个坐标轴

QwtPlotCurve: 曲线类,用于绘制各种曲线

QwtPlotMarker: 标尺类,用于绘制刻度线

QwtData: 定义任何曲线类型的数据接口

QwtPlotGrid: 网格

QwtPlotHistogram: 直方图

QwtPlotBarChart: 条形图表

QwtPlotMultiBarChart: 成组的条形图表——堆叠或并排对齐

QwtPlotShapeItem: 显示矩形、圆、多边形和其他所有的形状的plot item,可以用QPainterPah表示

QwtPlotTextLabel: 和QwtPlotMarker相反,文本不是基于plot坐标排列,而是根据画布(canvas)的几何形状(geometry)

QwtScaleTransformation已经被QwtTransform和QwtNullTransform、QwtLogTransform、QwtPowerTransform替换

QwtDate: 在QDateTime和Double之间转换的方法的集合

QwtPlotPanner: 平移器(用鼠标左键平移)

QwtPlotMagnifier: 放大器(用鼠标滚轮缩放)

QwtPlotCanvas: 画布

QwtScaleMap: 比例图( 可以提供一个逻辑区域到实际区域的坐标转换 )

QwtScaleWidget: 比例窗口

QwtScaleDiv: 比例布局

QwtLegent: 标注

QwtPlotLayout: 布局管理器

QwtScaleDraw: 自画坐标轴

QwtAbstractScale: 包含刻度尺的所有类的抽象基类

QwtAbstractScaleDraw: 绘制刻度尺的抽象基类

QwtAbstractSlider: 滑块部件的抽象基类

QwtAlphaColorMap: 可以改变颜色的alpha值

QwtAnalogClock: 时钟的模拟类

QwtArrayData: 包含2个QwtArray<double>实例的数据类

QwtArrowButton: 箭头按钮

QwtClipper: 剪贴板类

QwtColorMap: 提供数值到颜色的映射功能

QwtCompass: 指南针部件

QwtCompassMagnetNeedle: 指南针部件的磁针

QwtCompassRose: 罗盘部件的抽象基类

QwtCompassWindArrow: 风向标的指示器

QwtPlot: 地基容器,里面可放其他对象

QwtPlotItem: 负责控制绘图数据的产生和传递,并绘制一个坐标轴

QwtPlotCurve: 曲线类,用于绘制各种曲线

QwtPlotMarker: 标尺类,用于绘制刻度线

QwtData: 定义任何曲线类型的数据接口

QwtPlotGrid: 网格

QwtPlotHistogram: 直方图

QwtPlotBarChart: 条形图表

QwtPlotMultiBarChart: 成组的条形图表——堆叠或并排对齐

QwtPlotShapeItem: 显示矩形、圆、多边形和其他所有的形状的plot item,可以用QPainterPah表示

QwtPlotTextLabel: 和QwtPlotMarker相反,文本不是基于plot坐标排列,而是根据画布(canvas)的几何形状(geometry)

QwtScaleTransformation已经被QwtTransform和QwtNullTransform、QwtLogTransform、QwtPowerTransform替换

QwtDate: 在QDateTime和Double之间转换的方法的集合

QwtPlotPanner: 平移器(用鼠标左键平移)

QwtPlotMagnifier: 放大器(用鼠标滚轮缩放)

QwtPlotCanvas: 画布

QwtScaleMap: 比例图( 可以提供一个逻辑区域到实际区域的坐标转换 )

QwtScaleWidget: 比例窗口

QwtScaleDiv: 比例布局

QwtLegent: 标注

QwtPlotLayout: 布局管理器

QwtScaleDraw: 自画坐标轴

QwtPlot绘制二维曲线

自己编写了一个通过QwtPlot绘制二维曲线的定制类,该类中应用了QwtPlotGrid设置栅格显示,通过QwtLegend设置图例,通过QwtPlotCurve添加曲线,通过QwtText设置文字标注,通过QwtPlotZoomer设置区域缩放,通过QwtPlotRenderer把绘图区域生成pdf文件,通过QwtPlotItem显示某点的坐标值等。效果图:

上源码:

//CPlot.h
#ifndef CPLOT_H
#define CPLOT_H#include <QVector>
#include <qwt_plot.h>
#include <qwt_plot_grid.h>
#include <qwt_legend.h>
#include <qwt_legend_label.h>
#include <qwt_plot_legenditem.h>
#include <qwt_plot_curve.h>
#include <qwt_plot_textlabel.h>
#include <qwt_plot_zoomer.h>
#include <qwt_scale_draw.h>
#include <qwt_plot_renderer.h>
#include <QMessageBox>class CPlot : public QwtPlot
{Q_OBJECTpublic:CPlot(QWidget *parent = 0);virtual ~CPlot();
private:int CurNum;QVector<QwtPlotCurve *>  m_curve;QwtPlotZoomer *m_zoomer[2];//绘图插件的鼠标放大缩小功能QwtPlotTextLabel *InfoLabel;private:void InsertLegnd();void SetZoom();public:virtual void replot();void InsertCurve(QString Title, QColor color);QwtPlotCurve *Curve(int nId);void PlotCurve(const int curId, const double *xData, const double *yData, const int Len);void PlotCurve(const int curId,  QVector<double> &xData, const QVector<double> &yData);void InsertText(QString str, int pos);void ClearCuerve();void RemoveCurve(int id);void ExportCurPdf();
private slots:void showItem(const QVariant &itemInfo, bool on);
};#endif // CPLOT_H//CPlot.cpp
#include "cplot.h"CPlot::CPlot(QWidget *parent): QwtPlot(parent),CurNum(0)
{//变量初始化m_zoomer[0] = NULL;m_zoomer[1] = NULL;InfoLabel = new QwtPlotTextLabel();//设置背景布QLinearGradient gradient(0, 0, 0, 400); //背景布gradient.setColorAt(0, QColor(90, 90, 90));gradient.setColorAt(0.38, QColor(105, 105, 105));gradient.setColorAt(1, QColor(70, 70, 70));this->setCanvasBackground(QBrush(gradient));this->setAutoReplot( false );//设置网格QwtPlotGrid *grid = new QwtPlotGrid;grid->enableXMin( true );grid->setMajorPen( Qt::gray, 0, Qt::DotLine );grid->setMinorPen( Qt::darkGray, 0, Qt::DotLine );grid->attach( this );//自动适应的坐标轴设置this->setAxisAutoScale(QwtPlot::yLeft, true);this->setAxisAutoScale(QwtPlot::xBottom, true);QwtScaleDraw *scaleDraw = axisScaleDraw(QwtPlot::yLeft);if (scaleDraw){scaleDraw->enableComponent(QwtAbstractScaleDraw::Backbone,false);}//this->setAxisScaleDraw(QwtPlot::yLeft, )//设置线宽this->setLineWidth( 0 );//图例InsertLegnd();//缩放SetZoom();
}
void CPlot::InsertLegnd()
{QwtLegend *legend = new QwtLegend;legend->setDefaultItemMode(QwtLegendData::Checkable);this->insertLegend( legend,QwtPlot::BottomLegend);connect(legend, SIGNAL(checked(const QVariant &, bool, int)),this,  SLOT(showItem(const QVariant &, bool)));
}
void CPlot::replot()
{QwtPlot::replot();}
void CPlot::InsertCurve(QString Title, QColor color)
{QwtPlotCurve *Cur = new QwtPlotCurve();Cur->setTitle(Title);Cur->setPen(color);m_curve.append(Cur);Cur->attach( this );//图例QwtLegend *lgd = qobject_cast<QwtLegend *>( legend() );QList<QWidget *> legendWidgets = lgd->legendWidgets( itemToInfo( Cur ) );if ( legendWidgets.size() == 1 ){QwtLegendLabel *legendLabel =qobject_cast<QwtLegendLabel *>( legendWidgets[0] );if ( legendLabel )legendLabel->setChecked( true );}CurNum++;
}
QwtPlotCurve * CPlot::Curve(int nId)
{if (m_curve[nId] != NULL){return m_curve[nId];}else{return NULL;}
}
void CPlot::PlotCurve(const int curId, const double *xData, const double *yData, const int Len)
{if(curId >= m_curve.size()){QMessageBox::critical(this, tr("警告"), tr("未添加第%1条曲线").arg(curId));return; }if (m_curve[curId] != NULL){m_curve[curId]->setSamples(xData,yData,Len);m_curve[curId]->attach(this);}   //自动适应的坐标轴设置this->setAxisAutoScale(QwtPlot::yLeft, true);this->setAxisAutoScale(QwtPlot::xBottom, true);this->replot();SetZoom();}
void CPlot::PlotCurve(const int curId, QVector<double> &xData, const QVector<double> &yData)
{if(curId >= m_curve.size()){QMessageBox::critical(this, tr("警告"), tr("未添加第%1条曲线").arg(curId));return; }if (m_curve[curId] != NULL){m_curve[curId]->setSamples(xData,yData);m_curve[curId]->attach(this);}//自动适应的坐标轴设置this->setAxisAutoScale(QwtPlot::yLeft, true);this->setAxisAutoScale(QwtPlot::xBottom, true);this->replot();SetZoom();
}
void CPlot::InsertText(QString str, int pos)
{QwtText TextLabel( str );TextLabel.setRenderFlags( pos );QFont font;font.setBold( true );font.setPointSize(10);TextLabel.setFont( font );TextLabel.setColor(Qt::green);InfoLabel->setText(TextLabel);InfoLabel->attach(this);
}
void CPlot::SetZoom()
{//此处创建左键缩放功能可以使得右键恢复至适应之后的坐标轴//清理缩放功能信息if (m_zoomer[0] != NULL){delete m_zoomer[0];m_zoomer[0] =NULL;}if (m_zoomer[1] != NULL){delete m_zoomer[1];m_zoomer[1] =NULL;}m_zoomer[0] = new QwtPlotZoomer( QwtPlot::xBottom, QwtPlot::yLeft,this->canvas() );m_zoomer[1] = new QwtPlotZoomer( QwtPlot::xTop, QwtPlot::yRight,this->canvas() );for (int i=0; i<2; ++i){m_zoomer[i]->setTrackerMode( QwtPicker::AlwaysOff );m_zoomer[i]->setRubberBand( QwtPicker::NoRubberBand );// 右键: 恢复1次// Ctrl+右键: 直接回到原始m_zoomer[i]->setMousePattern( QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlModifier );m_zoomer[i]->setMousePattern( QwtEventPattern::MouseSelect3,Qt::RightButton );}m_zoomer[0]->setRubberBand( QwtPicker::RectRubberBand );m_zoomer[0]->setRubberBandPen( QColor( Qt::green ) );m_zoomer[0]->setTrackerMode( QwtPicker::ActiveOnly );m_zoomer[0]->setTrackerPen( QColor( Qt::white ) );m_zoomer[0]->setEnabled( true );m_zoomer[0]->zoom( 0 );m_zoomer[1]->setEnabled( true );m_zoomer[1]->zoom( 0 );
}
void CPlot::RemoveCurve(int id)
{if (id >= m_curve.size()){return;}//for (int i=0; i<m_curve.size(); ++i)//{m_curve[id]->setSamples(NULL);//}delete m_curve[id];m_curve[id] = NULL;//m_curve.remove(id);this->replot();
}
void CPlot::ClearCuerve()
{for (int i=0; i<m_curve.size(); ++i){m_curve[i]->setSamples(NULL);}this->replot();
}
void CPlot::ExportCurPdf()
{QwtPlotRenderer renderer;renderer.exportTo( this, "*.pdf" );
}
CPlot::~CPlot()
{for (int i=0; i<m_curve.size(); ++i){if (m_curve[i] != NULL){delete m_curve[i];m_curve[i] = NULL;}}m_curve.clear();
}
void CPlot::showItem(const QVariant &itemInfo, bool on)
{QwtPlotItem *plotItem = infoToItem(itemInfo);if (plotItem){plotItem->setVisible(on);}this->replot();
}

Qt开发总结(21)——Qwt第三方绘图组件相关推荐

  1. Qt开发笔记之Qwt(一):Qwt介绍、编译与Demo

    若该文为原创文章,未经允许不得转载 原博主博客地址:长沙红胖子_长沙红胖子网络科技有限公司_CSDN博客 原博主博客导航:红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术.树莓派.三维.Op ...

  2. Qt开发笔记之Qwt(二):Qwt仪表盘的基本使用

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  3. linux系统中如何安装qwt,linux下Qt开发环境中qwt库的安装与使用

    qwt的安装与使用 安装好qt开发环境后,先去下载qwt库源代码. 以我下载的qwt-6.0.1.zip为例,解压得到qwt-6.0.1. 1.安装qwt-6.0.1 执行下面的命令:1 cd qwt ...

  4. 基于arm的嵌入式QT开发(课程设计)

    一. 项目要求 配置QT5.7基于x86及arm 等两种CPU架构的调试及开发环境: 移植arm编译后的QT5.7及屏幕校准工具tslib1.4至CORTEX ARM9实验平台: 开发基于QT5.7的 ...

  5. QT开发(十七)——QWT简介

    QT开发--QWT简介 一.QWT简介 QWT,即Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目, 可生成各种统计图,是为具有技术专业 ...

  6. QT开发(十)——QT输入组件

    QT开发(十)--QT输入组件 QT中有十三中输入组件,分别是下拉列表框QComboBox.字体下拉框QFontComboBox.行编辑框QLineEdit.文本编辑框QTextEdit.无格式文本编 ...

  7. Qt (高仿Visio)流程图组件开发(二) 基本图元绘制 图元间连线绘制

    文章目录 本系列目录 前言 一.如何绘制图元 二.两图元之间如何连线 三.如何实现线跟随图元移动 四.线的位置判断 总结 本系列目录 Qt (高仿Visio)流程图组件开发(一) 效果展示及基本开发框 ...

  8. 【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.1 效果演示、技术点

    本节对应的视频讲解:B_站_视_频 https://www.bilibili.com/video/BV14P4y197pi Qt 中绘图用到的类是 QPainter,可以实现点.线.矩形.圆形.多边形 ...

  9. Qt (高仿Visio)流程图组件开发(三) 图元基类如何定义,流程图多种图元类型实现

    文章目录 本系列目录 前言 一.图元基类的定义 1.图元信息基类结构体 2.图元位置 3.父子对象关系 二.自定义图元实现 1.自定义图元基类(FlowchartGraphicsItem)与Qt原生图 ...

最新文章

  1. php访问参数错误,phpcms参数错误怎么办
  2. 力扣 136. 只出现一次的数字 【异或运算】
  3. boost::function模块实现分配器的测试程序
  4. PHP的Postman使用
  5. iOS self 和 super 学习
  6. 大杂烩, 硬盘安装Linux
  7. 30分钟学会使用grunt打包前端代码
  8. FreeMarker 集合遍历
  9. api 创建zookeeper客户端_一文了解 Zookeeper 基本原理与应用场景
  10. oracle快捷语句框架中,Oracle框架:PL/SQL编程:
  11. 1002 写出这个数 (20 分)—PAT (Basic Level) Practice (中文)
  12. docker设置开机自启动
  13. 产品配件类目税目分类_商品及税收分类编码选择技巧
  14. 归并排序 Java实现 简单易懂
  15. 【转】打造个性化ghostxp光盘另类教程(3)
  16. 基于开源飞控系统和安卓系统的4g5g物联网无人机实现
  17. 人脸识别像素最低_一种低分辨率图像的人脸识别方法与流程
  18. 用树莓派搭建全功能NAS服务器(02):Docker用法下载机配置
  19. wifidog 认证
  20. electron坑: 缩小放大快捷键

热门文章

  1. 重庆大学804工商管理学硕考研经验贴
  2. Kylin 在满帮集团千亿级用户访问行为分析中的应用
  3. MybatisPlus--QueryWrapper
  4. hdu6740 MUV LUV EXTRA
  5. Java封装统一返回结果集
  6. 云原生下的DevOps与持续交付
  7. EMCP应用于——空调系统远程管理物联网云平台
  8. 无公网IP实现绿盾终端连接服务端
  9. Nginx之12火眼金睛 - (状态监控 日志分析)
  10. NOIP2018提高组初赛准备