QT学习 之 QwtPlot(数学绘图)
2015-11-26 14:17
549 查看
QT对于统计图像、函数图像等的绘制是没有相关组件的帮助的,只有利用手工绘制图片。
QwtPlot是用来绘制二维图像的widget,继承自QFrame 和 QwtPlotDict。不过严格的说来,它只是一个视图窗口,真正的绘制设备是它的中心部件QwtPlotCanvas类。
在它的画板上可以无限制的显示绘画组件。绘画组件可以是曲线(QwtPlotCurve)、标记(QwtPlotMarker)、网格(QwtPlotGrid)、或者其它从QwtPlotItem继承的组件。
下面看一个小例子,结果如下:
该实例绘制了两条sin曲线并自动刷新曲线显示,一个曲线是平缓曲线,另一条是硬拐点曲线,之后按动按键使两个曲线均向右平移,注意,同时移动多条曲线的情况下不要使用setData函数了,程序会错误退出,应该使用setSamples函数,具体参见代码
散点图:
QwtPlot是用来绘制二维图像的widget,继承自QFrame 和 QwtPlotDict。不过严格的说来,它只是一个视图窗口,真正的绘制设备是它的中心部件QwtPlotCanvas类。
在它的画板上可以无限制的显示绘画组件。绘画组件可以是曲线(QwtPlotCurve)、标记(QwtPlotMarker)、网格(QwtPlotGrid)、或者其它从QwtPlotItem继承的组件。
QwtPlot拥有4个axes(轴线)
一个QwtPlot有四条坐标抽,每一个项都依附于X轴或者Y轴。每一个轴的刻度可以通过set (QwtScaleDiv)或者根据绘制的图元通过算法(QwtScaleEngine)单独配置。变量 | 功能 |
---|---|
yLeft | Y axis left of the canvas. |
yRight | Y axis right of the canvas. |
xBottom | X axis below the canvas. |
xTop | X axis above the canvas. |
常用函数接口
接口 | 功能 |
---|---|
setAxisTitle | 设置轴标题 |
enableAxis | 主要是显示xTop,yRight坐标轴 |
setAxisMaxMajor | 设置某个某个坐标轴扩大比例尺的最大间隔数目 |
setAxisMaxMinor | 设置某个某个坐标轴缩小比例尺的最大间隔数目 |
setAxisScale | 禁用自动缩放比例尺,为某个坐标轴指定一个修改的比例尺 |
insertLegend | 添加图例(标注) |
常用组件
组件 | 功能 |
---|---|
QwtPlotCurve | 曲线 |
QwtPlotMarker | 标记 |
QwtPlotGrid | 网格 |
QwtPlotHistogram | 直方图 |
other | 从QwtPlotItem继承的组件 |
QwtPlotItem plot | 能显示的类,如果想要实现自己绘画图形,要继承此类实现rtti和draw接口 |
QwtPlotPanner | 平移器 (用鼠标左键平移) |
QwtPlotMagnifier | 放大器 (用鼠标滚轮缩放) |
QwtPlotCanvas | 画布 |
QwtScaleMap | 比例图—可以提供一个逻辑区域到实际区域的坐标转换 |
QwtScaleWidget | 比例窗口 |
QwtScaleDiv | 比例布局 |
QwtLegent | 标注 |
QwtPlotLayout | 布局管理器 |
QwtScaleDraw | 自画坐标轴 |
QwtPlotCure简介
常见接口 | 功能 |
---|---|
setPen | 设置画笔 |
setData | 设置曲线的数据 |
setStyle | 设置曲线形式,点、直线、虚线等等 |
setCurveAttribute | 设置曲线属性,一般设置Fitted |
attch | 把曲线附加到QwlPlot上 |
该实例绘制了两条sin曲线并自动刷新曲线显示,一个曲线是平缓曲线,另一条是硬拐点曲线,之后按动按键使两个曲线均向右平移,注意,同时移动多条曲线的情况下不要使用setData函数了,程序会错误退出,应该使用setSamples函数,具体参见代码
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QDebug> #include <Qt/qmath.h> #include <QVector> #include <qwt_plot.h> #include <qwt_plot_curve.h> #include <qwt_plot_magnifier.h> #include <qwt_plot_panner.h> #include <qwt_legend.h> #include <qwt_point_data.h> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_pushButton_clicked(); private: Ui::MainWindow *ui; QwtPlotCurve curve; QwtPlotCurve curve_r;//硬折点曲线画布 QVector<double> xs; QVector<double> ys; }; #endif // MAINWINDOW_H
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QHBoxLayout> #include <QtGui/QApplication> #include <Qt/qmath.h> #include <QVector> #include <qwt_plot.h> #include <qwt_plot_curve.h> #include <qwt_plot_magnifier.h> #include <qwt_plot_panner.h> #include <qwt_legend.h> #include <qwt_point_data.h> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->plot->resize(640,400); ui->plot->setAutoReplot(true); //设置坐标轴的名称 ui->plot->setAxisTitle(QwtPlot::xBottom, "x->"); ui->plot->setAxisTitle(QwtPlot::yLeft, "y->"); //设置坐标轴的范围 ui->plot->setAxisScale(QwtPlot::yLeft, -1.0, 1.0); //设置右边标注 ui->plot->insertLegend(new QwtLegend(), QwtPlot::RightLegend); //使用滚轮放大/缩小 (void) new QwtPlotMagnifier( ui->plot->canvas() ); //使用鼠标左键平移 (void) new QwtPlotPanner( ui->plot->canvas() ); //计算曲线数据 for (double x = 0; x < 2.0 * M_PI; x+=(M_PI / 10.0)) { xs.append(x); ys.append(qSin(x)); } //平滑曲线 curve.attach(ui->plot);//把曲线附加到plot上 curve.setSamples(xs,ys); curve.setStyle(QwtPlotCurve::Lines);//设置曲线上是点还是线,默认是线,所以此行可不加 curve.setCurveAttribute(QwtPlotCurve::Fitted, true);//使曲线更光滑,不加这句曲线会很硬朗,有折点 curve.setPen(QPen(Qt::blue));//设置画笔 curve_r.attach(ui->plot); curve_r.setSamples(xs,ys); curve_r.setPen(QPen(Qt::green)); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { for(int i=ys.count()-1;i>=1;i--) { ys[i]=ys.at(i-1); } ys[0]=0.5; curve.setSamples(xs,ys); curve_r.setSamples(xs,ys); }
散点图:
//头文件 class CCruvePlot:publicQwtPlot { public: CCruvePlot(); ~CCruvePlot(void); public: void drawPlotCruve(); private: QwtPlotCurve * curve; QVector<double> xData; QVector<double> yData; }; //实现文件: #include "cruvePlot.h" const int LineNum=7; const int PointNum=7; CCruvePlot::CCruvePlot(){} CCruvePlot::~CCruvePlot(void){} void CCruvePlot::drawPlotCruve() { //QMessageBox::information(this,"Running!","Running matlab Function....."); setTitle("A Simple QwtPlot Demonstration");//设置标题 insertLegend(new QwtLegend(), QwtPlot::RightLegend);//设置标线的栏 setAxisTitle(xBottom, "x -->"); setAxisScale(xBottom, 0.0, 10.0); setAxisTitle(yLeft, "y -->"); setAxisScale(yLeft, 0, 10.0); QwtPlotCurve *curve = new QwtPlotCurve("lineFirst");//实例化一条曲线 curve->attach(this); double *x=new double[PointNum]; double *y=new double[PointNum]; for(int i=0;i<PointNum;i++) { x[i]=i; y[i]=i+3; } curve->setSamples (x,y,PointNum);//传画曲线的数据 curve->setPen(QPen(Qt::red)); QwtPlotCurve *curve2 = new QwtPlotCurve("lineSecond");//实例化另一条线 curve2->attach(this); double *x2=new double[PointNum]; double *y2=new double[PointNum]; for(int i=0;i<PointNum;i++){ x2[i]=i*3; y2[i]=i+3; } curve2->setSamples (x2,y2,PointNum); curve2->setPen(QPen(Qt::blue)); return; }
相关文章推荐
- QwtPlot简单使用
- static struct QMetaObject const QwtPlot::staticMetaObject
- UFT/QTP的工作原理
- Qt中库函数的隐式调用与显式调用
- 解决"应用程序无法启动,因为应用程序的并行配置不正确"的问题(VS2008 + qt)
- 搭建MQTT协议环境
- QtMainWindow菜单的使用
- qt中文乱码问题
- qt程序打包
- QT 绘图设备和Graphics View Framework
- qt+cdb调试配置
- Qt停止线程的方法
- Qt翻译---补充
- qt 共享内存(QSharedMemory)
- 自学QT之实现QMessageBox的按钮中文显示
- Qt入门学习——Qt快速入门(vim纯代码编写)
- Qt之界面实现技巧
- QT中文乱码的解
- MQTT介绍
- Qt中SQLite3的增、删、改、查操作