该实例绘制了两条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); }
下面是按动按钮几次后的截图:
注意两条线不同的过渡变化