【Qt编程】基于QWT的曲线绘制及图例显示操作

http://blog.csdn.net/tengweitw/article/details/41911035

    在《QWT在QtCreator中的安装与使用》一文中,我们完成了QWT的安装,这篇文章我们讲讲基础曲线的绘制功能。

首先,我们新建一个Qt应用程序,然后一路默认即可。这时,你会发现总共有:mainwindow.h,mainwindow.cpp,main.cpp,mainwindow.ui四个文件。

然后,选中项目,添加新文件,添加一个c++类,我们假设命名为PlotLines,基类选择QwtPlot,选择继承自QWidget。

接着,在pro文件中添加

                                         INCLUDEPATH +=D:\Qt\Qt5.3.0\5.3\msvc2010_opengl\include\QWT                                          LIBS+= -lqwtd 注意,我这里是将绘制曲线单独用一个类PlotLines表示的,而不是向参考实例一样是直接放在其他类的内部。所以这里我们需要在类的头文件中添加关键性语句:     #define QWT_DLL

最后,在主文件main.cpp中添加我们类的头文件,并在函数中生成该类的实例并显示,修改后的main.cpp文件如下所示:

[cpp] view plaincopy

  1. #include "mainwindow.h"
  2. #include <QApplication>
  3. #include"plotlines.h"
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7. //    MainWindow w;//这里的主窗口我们没有使用,当然也可以在主窗口中显示曲线
  8. //    w.show();
  9.     PlotLines line;  
  10.     line.show();  
  11. return a.exec();  
  12. }  
PlotLines.h文件如下:

[cpp] view plaincopy

  1. #ifndef PLOTLINES_H
  2. #define PLOTLINES_H
  3. #define QWT_DLL
  4. #include<qwt_plot.h>
  5. #include <qwt_plot_layout.h>
  6. #include <qwt_plot_canvas.h>
  7. #include <qwt_plot_renderer.h>
  8. #include <qwt_plot_grid.h>
  9. #include <qwt_plot_histogram.h>
  10. #include <qwt_plot_curve.h>
  11. #include <qwt_plot_zoomer.h>
  12. #include <qwt_plot_panner.h>
  13. #include <qwt_plot_magnifier.h>
  14. #include <qwt_legend.h>
  15. #include <qwt_legend_label.h>
  16. #include <qwt_column_symbol.h>
  17. #include <qwt_series_data.h>
  18. #include <qpen.h>
  19. #include <qwt_symbol.h>
  20. #include <qwt_picker_machine.h>
  21. class PlotLines : public QwtPlot  
  22. {  
  23.     Q_OBJECT  
  24. public:  
  25. explicit PlotLines(QWidget *parent = 0);  
  26. private Q_SLOTS:  
  27. void showItem(const QVariant &itemInfo, bool on);//点击图例,显示相应的曲线
  28. };  
  29. #endif // PLOTLINES_H
PlotLines.cpp文件如下:

[cpp] view plaincopy

  1. #include "plotlines.h"
  2. PlotLines::PlotLines(QWidget *parent) :  
  3.     QwtPlot(parent)  
  4. {  
  5.     setTitle("图的标题");  
  6. //---------设置画布---------//
  7.     QwtPlotCanvas *canvas=new QwtPlotCanvas();  
  8.     canvas->setPalette(Qt::white);  
  9.     canvas->setBorderRadius(10);  
  10.     setCanvas( canvas );  
  11.     plotLayout()->setAlignCanvasToScales( true );  
  12. //-----------设置x,y坐标和范围--------------//
  13.     setAxisTitle( QwtPlot::yLeft, "ylabel" );  
  14.     setAxisTitle( QwtPlot::xBottom, "xlabel" );  
  15.     setAxisScale(QwtPlot::yLeft,0.0,10.0);  
  16.     setAxisScale(QwtPlot::xBottom,0.0,10.0);  
  17. //----------------设置栅格线-------------------//
  18.     QwtPlotGrid *grid = new QwtPlotGrid;  
  19.     grid->enableX( true );//设置网格线
  20.     grid->enableY( true );  
  21.     grid->setMajorPen( Qt::black, 0, Qt::DotLine );  
  22.     grid->attach( this );  
  23. //-----------------开始画图----------------------//
  24.     QwtPlotCurve *curve=new QwtPlotCurve("curve");  
  25. // curve->setTitle( "信道"+QString( "%1 " ).arg( i+1));
  26.     curve->setPen(Qt::blue,2);//设置曲线颜色 粗细
  27.     curve->setRenderHint(QwtPlotItem::RenderAntialiased,true);//线条光滑化
  28.     QwtSymbol *symbol = new QwtSymbol( QwtSymbol::Ellipse,  
  29.     QBrush( Qt::yellow ), QPen( Qt::red, 2 ), QSize( 6, 6) );//设置样本点的颜色、大小
  30.     curve->setSymbol( symbol );//添加样本点形状
  31.     QPolygonF points1, points2;//输入节点数据QPointF(x,y)
  32.     points1<<QPointF(1,1)<<QPointF(2,2)<<QPointF(3,3)<<QPointF(4,4)<<QPointF(5,5)<<QPointF(6,6)<<QPointF(7,7);  
  33.     points2<<QPointF(1,2)<<QPointF(2,3)<<QPointF(3,4)<<QPointF(4,5)<<QPointF(5,6)<<QPointF(6,7)<<QPointF(7,8);  
  34.     curve->setSamples(points1);  
  35.     curve->attach( this );  
  36.     curve->setLegendAttribute(curve->LegendShowLine);//显示图例的标志,这里显示线的颜色。
  37. //曲线2的形状采用默认,即不单独设置画笔的颜色、样本点的显示
  38.     QwtPlotCurve *curve2=new QwtPlotCurve("curve2");  
  39.     curve2->setSamples(points2);  
  40.     curve2->attach( this );  
  41.     curve2->setLegendAttribute(curve->LegendShowLine);  
  42. //--------------设置图例可以被点击来确定是否显示曲线-----------------------//
  43.     QwtLegend *legend = new QwtLegend;  
  44.     legend->setDefaultItemMode( QwtLegendData::Checkable );//图例可被点击
  45.     insertLegend( legend, QwtPlot::RightLegend );  
  46.     connect( legend, SIGNAL( checked( const QVariant &, boolint ) ),  
  47.         SLOT( showItem( const QVariant &, bool ) ) );//点击图例操作
  48.     QwtPlotItemList items = itemList( QwtPlotItem::Rtti_PlotCurve );//获取画了多少条曲线,如果为获取其他形状,注意改变参数
  49. //  qDebug()<<items;
  50. for ( int i = 0; i < items.size(); i++ )  
  51.     {  
  52. if ( i == 0 )  
  53.         {  
  54. const QVariant itemInfo = itemToInfo( items[i] );  
  55.             QwtLegendLabel *legendLabel =  
  56.                 qobject_cast<QwtLegendLabel *>( legend->legendWidget( itemInfo ) );  
  57. if ( legendLabel )  
  58.                 legendLabel->setChecked( true );//
  59.             items[i]->setVisible( true );  
  60.         }  
  61. else
  62.         {  
  63.             items[i]->setVisible( false );  
  64.         }  
  65.     }  
  66. this->resize(600,400);  
  67. this->replot();  
  68.     setAutoReplot( true );//设置自动重画,相当于更新
  69. }  
  70. //点击图例,显示相应的曲线
  71. void PlotLines::showItem(const QVariant &itemInfo, bool on)  
  72. {  
  73.     QwtPlotItem *plotItem = infoToItem( itemInfo );  
  74. if ( plotItem )  
  75.         plotItem->setVisible( on );  
  76. }  

其他的文件没有作任何改变,在此就不列出来了。显示结果如下图:

1、初始界面如下:

2、点击右上角的图例后:

本文所创建的PlotLines类,完成的功能如下:

1、坐标轴的绘制

2、根据数据点绘制相应的曲线

3、右上角的图例可以点击,并显示或隐藏对应曲线

原文:http://blog.csdn.net/tengweitw/article/details/41911035

作者:nineheadedbird

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏申龙斌的程序人生

SeismicPro地震剖面显示程序

SeismicPro是我用C#写的一款地震剖面显示软件,可从标准SEGY地震数据体中抽取纵测线和横测线的二维剖面,并以波形、变面积和变密度等多种方式进行专业化显...

3159
来自专栏林德熙的博客

matlab 画图

本文讲如何使用 matlab 画图。 本文包括:折线图的 x轴和y轴、标题、图例 柱状图填充图案

1812
来自专栏DannyHoo的专栏

iOS中将字体设置成斜体且加粗

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

2801
来自专栏一“技”之长

Bootstrap响应式前端框架笔记十六——模态框交互

    模态框也可以称为弹出窗,其作用是当用户点击某个功能按钮后,在网页上弹出一个内容窗口。在Bootstrap中,创建模态框十分简单。首先模态框组件通过mod...

1021
来自专栏SnailTyan

matplotlib的基本用法(四)——设置legend图例

本文主要是关于matplotlib的一些基本用法。 Demo import matplotlib.pyplot as plt import numpy as n...

2227
来自专栏我分享我快乐

如何将flash制作的动画存成高质量的GIF

喜欢用flash制作GIF动画的同学有个疑惑就是flash直接导出的GIF质量不高无法达到我们对动画的色彩要求,所以下面教大家如何将flash制作的动画存成...

3337
来自专栏州的先生

【州末小课堂】使用PyQtGraph绘制上证指数精美走势图

1761
来自专栏IMWeb前端团队

React事件初探

React 是一个 Facebook 和 Instagram 用来创建用户界面的 JavaScript库。 创造 React 是为了解决一个问题:构建随着时间...

2348
来自专栏Python数据科学

Python十分钟制作属于你自己的个性logo

词云的使用相信大家已经不陌生了,使用很简单,直接调用wordcloud包就可以了。它的主要功能是根据文本词汇和词汇频率生成图片,从中可以直观的看出各个词汇所占比...

862
来自专栏Java后端技术

Web上的支持的图片格式以及它们之间的区别

821

扫码关注云+社区