学习这个东西方向对了,就对了一半
今天我开始学习基于qt库的一个开源的绘制2维的统计图的库--qwt。
我们画东西首先要有一个容器,不然都是徒劳,今天我们就介绍这个类--QwtPlot
它继承自QFrame和QwtPlotDict,QFrame提供一个QWidget的框架,QwtPlotDict为QwtPlot管理在其中的plot items,就是绘制的项。在QwtPlot上我们可以绘制无限多个的plot items,这些plot items可以是曲线,标记,格子以及继承自QwtPlotItem的子类。一个QwtPlot可以有四个轴,每个plot item连接到x和y轴上。在轴上的比例变换可以使用QwtScaleDiv,对于plot items比例可以使用QwtScaleEngine来计算,在每个轴上,QwtScaleEngine可以被单独设置。
在QwtPlot中有两个枚举类型。
Axis,轴,5个值,一个QwtPlot除了x和y,还有top和bottom轴,第五个是axisCnt,轴数,枚举从0开始,第五个为4,说明一共四个轴。另一个是LegendPosition,图例的位置。
它有五个值,分别指定插入一个图例仔什么位置,四个都是和x和y轴的位置有关,最后一个是特殊的,它允许不在这个Plot中,就是外部的。
这是今天写的一个小例子
/************************************************ * *author:周翔 *e-mail:604487178@qq.com *blog:http://blog.csdn.net/zhx6044 * * *************************************************/ #ifndef PLOT_H #define PLOT_H #include <qwt_plot.h> #include <qwt_plot_curve.h> #include <qwt_plot_picker.h> #include <qwt_plot_panner.h> #include <qwt_plot_magnifier.h> #include <qwt_legend.h> #include <qwt_plot_grid.h> #include <qwt_picker_machine.h> class Plot : public QwtPlot { Q_OBJECT public: explicit Plot(QWidget *parent = 0); ~Plot(); signals: public slots: private: QwtPlotCurve *sinCurve; QwtPlotCurve *cosCurve; QwtPlotPicker *picker; void initCanvas(); void initAxes(); void initCurves(); }; #endif // PLOT_H /************************************************ * *author:周翔 *e-mail:604487178@qq.com *blog:http://blog.csdn.net/zhx6044 * * *************************************************/ #include "plot.h" double _sin2(double x) { return ::sin(2 * x); } /** * @brief The FunctionData class 将一个函数包装一下,就像一个函数对象一样,但是又不一样,没有基于运行符()重载 * 而是基于多态,我们只需要继承它,实现相关的虚函数即可,它内部有自己的调用规则 */ class FunctionData: public QwtSyntheticPointData { public: FunctionData(double(*y)(double)): QwtSyntheticPointData(100), d_y(y) { } virtual double y(double x) const { return d_y(x); } private: double(*d_y)(double); }; Plot::Plot(QWidget *parent) : QwtPlot(parent) { initCanvas(); } Plot::~Plot() { } void Plot::initCanvas() { //右键拖拽 (new QwtPlotPanner(this->canvas()))->setMouseButton(Qt::RightButton); //y轴在放大的时候,坐标不变化 (new QwtPlotMagnifier(this->canvas()))->setAxisEnabled(QwtPlot::yLeft,false); //一个选择器,十字线,以xBottom和yLeft坐标 picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft, QwtPlotPicker::CrossRubberBand, QwtPicker::AlwaysOn, this->canvas()); picker->setStateMachine(new QwtPickerDragPointMachine());//拖拽点起作用 picker->setRubberBandPen(QPen(QColor(Qt::white))); picker->setTrackerPen(QColor(Qt::yellow)); setAutoFillBackground(true); this->canvas()->setPalette(QPalette (QColor(Qt::darkCyan))); setTitle("sin(x) and cos(x)"); //这个会根据画板中的图在RightLegend显示一个图例 insertLegend(new QwtLegend(),QwtPlot::RightLegend); QwtPlotGrid *grid = new QwtPlotGrid;//网格 grid->enableXMin(true); grid->setMajPen(QPen(Qt::white, 0, Qt::DotLine));//大格子 grid->setMinPen(QPen(Qt::gray, 0 , Qt::DotLine));//大格子里的小格子 grid->attach(this); initAxes(); initCurves(); } void Plot::initAxes() { setAxisTitle(QwtPlot::yLeft, QObject::trUtf8("y 轴")); setAxisScale(QwtPlot::yLeft, -1.0, 1.0); setAxisTitle(QwtPlot::xBottom,QObject::trUtf8("x 轴")); setAxisScale(QwtPlot::xBottom,-5.0,5.0); } void Plot::initCurves() { sinCurve = new QwtPlotCurve("y = sin(2x)"); //切换渲染提示 启用抗锯齿 sinCurve->setRenderHint(QwtPlotItem::RenderAntialiased); sinCurve->setLegendAttribute(QwtPlotCurve::LegendShowLine); sinCurve->setPen(QPen(Qt::yellow)); sinCurve->attach(this); cosCurve = new QwtPlotCurve("y = cos(x)"); cosCurve->setRenderHint(QwtPlotItem::RenderAntialiased); //这个会改变曲线在QwtLegend显示的样式,可以是线,矩形,符号, cosCurve->setLegendAttribute(QwtPlotCurve::LegendNoAttribute); cosCurve->setPen(QPen(Qt::red)); cosCurve->attach(this); sinCurve->setData(new FunctionData(_sin2)); cosCurve->setData(new FunctionData(::cos)); }