【Qt编程】基于QWT的曲线绘制及图例显⽰操作
日语名言
在 ⼀⽂中,我们完成了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⽂件如下所⽰:
#include "mainwindow.h"
#include <QApplication>
#include"plotlines.h"
int main(int argc, char *argv[])感恩有你歌曲
{
QApplication a(argc, argv);
// MainWindow w;//这⾥的主窗⼝我们没有使⽤,当然也可以在主窗⼝中显⽰曲线
// w.show();
PlotLines line;
line.show();
();
}
PlotLines.h⽂件如下:
#ifndef PLOTLINES_H
#define PLOTLINES_H
#define QWT_DLL
#include<qwt_plot.h>
#include <qwt_plot_layout.h>
#include <qwt_plot_canvas.h>
#include <qwt_plot_renderer.h>
#include <qwt_plot_grid.h>
#include <qwt_plot_histogram.h>
#include <qwt_plot_curve.h>
#include <qwt_plot_zoomer.h>
#include <qwt_plot_panner.h>
#include <qwt_plot_magnifier.h>
#include <qwt_legend.h>
#include <qwt_legend_label.h>
#include <qwt_column_symbol.h>
#include <qwt_ries_data.h>
#include <qpen.h>快乐无价
#include <qwt_symbol.h>
#include <qwt_picker_machine.h>
class PlotLines : public QwtPlot
{
Q_OBJECT
蝉虫public:
explicit PlotLines(QWidget *parent = 0);
private Q_SLOTS:
void showItem(const QVariant &itemInfo, bool on);//点击图例,显⽰相应的曲线};
#endif // PLOTLINES_H
PlotLines.cpp⽂件如下:
#include "plotlines.h"
PlotLines::PlotLines(QWidget *parent) :
QwtPlot(parent)
{
tTitle("图的标题");
//---------设置画布---------//
QwtPlotCanvas *canvas=new QwtPlotCanvas();
canvas->tPalette(Qt::white);
canvas->tBorderRadius(10);
tCanvas( canvas );
plotLayout()->tAlignCanvasToScales( true );
//-----------设置x,y坐标和范围--------------//
tAxisTitle( QwtPlot::yLeft, "ylabel" );
防恐防暴知识>王者荣耀如何开挂tAxisTitle( QwtPlot::xBottom, "xlabel" );
tAxisScale(QwtPlot::yLeft,0.0,10.0);
tAxisScale(QwtPlot::xBottom,0.0,10.0);
//----------------设置栅格线-------------------//
QwtPlotGrid *grid = new QwtPlotGrid;
grid->enableX( true );//设置⽹格线
grid->enableY( true );
怎么插花
grid->tMajorPen( Qt::black, 0, Qt::DotLine );
grid->attach( this );
//-----------------开始画图----------------------//
QwtPlotCurve *curve=new QwtPlotCurve("curve");
// curve->tTitle( "信道"+QString( "%1 " ).arg( i+1));
curve->tPen(Qt::blue,2);//设置曲线颜⾊粗细
curve->tRenderHint(QwtPlotItem::RenderAntialiad,true);//线条光滑化
QwtSymbol *symbol = new QwtSymbol( QwtSymbol::Ellip,
QBrush( Qt::yellow ), QPen( Qt::red, 2 ), QSize( 6, 6) );//设置样本点的颜⾊、⼤⼩
curve->tSymbol( symbol );//添加样本点形状
QPolygonF points1, points2;//输⼊节点数据QPointF(x,y)
points1<<QPointF(1,1)<<QPointF(2,2)<<QPointF(3,3)<<QPointF(4,4)<<QPointF(5,5)<<QPointF(6,6)<<QPointF(7,7);
points2<<QPointF(1,2)<<QPointF(2,3)<<QPointF(3,4)<<QPointF(4,5)<<QPointF(5,6)<<QPointF(6,7)<<QPointF(7,8);
curve->tSamples(points1);
curve->attach( this );
curve->tLegendAttribute(curve->LegendShowLine);//显⽰图例的标志,这⾥显⽰线的颜⾊。
//曲线2的形状采⽤默认,即不单独设置画笔的颜⾊、样本点的显⽰
QwtPlotCurve *curve2=new QwtPlotCurve("curve2");
curve2->tSamples(points2);
curve2->attach( this );
curve2->tLegendAttribute(curve->LegendShowLine);
//--------------设置图例可以被点击来确定是否显⽰曲线-----------------------//
QwtLegend *legend = new QwtLegend;
legend->tDefaultItemMode( QwtLegendData::Checkable );//图例可被点击
inrtLegend( legend, QwtPlot::RightLegend );
connect( legend, SIGNAL( checked( const QVariant &, bool, int ) ),
SLOT( showItem( const QVariant &, bool ) ) );//点击图例操作
QwtPlotItemList items = itemList( QwtPlotItem::Rtti_PlotCurve );//获取画了多少条曲线,如果为获取其他形状,注意改变参数 // qDebug()<<items;
for ( int i = 0; i < items.size(); i++ )
{
if ( i == 0 )
{
const QVariant itemInfo = itemToInfo( items[i] );
QwtLegendLabel *legendLabel =
qobject_cast<QwtLegendLabel *>( legend->legendWidget( itemInfo ) );
if ( legendLabel )
legendLabel->tChecked( true );//
items[i]->tVisible( true );
}
需要一半留下一半
el
{
items[i]->tVisible( fal );
}
}
this->resize(600,400);
this->replot();
tAutoReplot( true );//设置⾃动重画,相当于更新
}
//点击图例,显⽰相应的曲线
void PlotLines::showItem(const QVariant &itemInfo, bool on)
{
QwtPlotItem *plotItem = infoToItem( itemInfo );
if ( plotItem )
plotItem->tVisible( on );
}
其他的⽂件没有作任何改变,在此就不列出来了。显⽰结果如下图: 1、初始界⾯如下:
2、点击右上⾓的图例后:
本⽂所创建的PlotLines类,完成的功能如下:
1、坐标轴的绘制
2、根据数据点绘制相应的曲线
3、右上⾓的图例可以点击,并显⽰或隐藏对应曲线作者:nineheadedbird