您的位置:首页 > 编程语言 > Qt开发

QT学习 之 QwtPlot(数学绘图)

2015-11-26 14:17 549 查看
QT对于统计图像、函数图像等的绘制是没有相关组件的帮助的,只有利用手工绘制图片。

QwtPlot是用来绘制二维图像的widget,继承自QFrame 和 QwtPlotDict。不过严格的说来,它只是一个视图窗口,真正的绘制设备是它的中心部件QwtPlotCanvas类。

在它的画板上可以无限制的显示绘画组件。绘画组件可以是曲线(QwtPlotCurve)、标记(QwtPlotMarker)、网格(QwtPlotGrid)、或者其它从QwtPlotItem继承的组件。

QwtPlot拥有4个axes(轴线)

一个QwtPlot有四条坐标抽,每一个项都依附于X轴或者Y轴。每一个轴的刻度可以通过set (QwtScaleDiv)或者根据绘制的图元通过算法(QwtScaleEngine)单独配置。

变量功能
yLeftY axis left of the canvas.
yRightY axis right of the canvas.
xBottomX axis below the canvas.
xTopX 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