Qt中直方图的使用-qwt例子

 时间:2024-10-10 12:20:05

大家应该都清楚qt本身是无法实现复杂的图标绘画的,而qwt就是专门针对qt开发的图标绘制类库。现将直方图例子的代码注释一遍,方便大家学习。

工具/原料

qwt6.1.0

qt5.3.0

方法/步骤

1、直方图效果图如下

Qt中直方图的使用-qwt例子

2、main.cpp代码如下:#include<qapplication.h>#include<qmainwindow.h>#include<qtoolbar.h>#include<qtoolbutton.h>#include<qcombobox.h>#include"barchart.h"classMainWindow:publicQMainWindow{public:MainWindow(QWidget*=NULL);private:BarChart*d_chart;};MainWindow::MainWindow(QWidget*parent):QMainWindow(parent){d_chart=newBarChart(this);setCentralWidget(d_chart);QToolBar*toolBar=newQToolBar(this);QComboBox*orientationBox=newQComboBox(toolBar);orientationBox->addItem("Vertical");orientationBox->addItem("Horizontal");orientationBox->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);QToolButton*btnExport=newQToolButton(toolBar);btnExport->setText("Export");btnExport->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);connect(btnExport,SIGNAL(clicked()),d_chart,SLOT(exportChart()));toolBar->addWidget(orientationBox);toolBar->addWidget(btnExport);addToolBar(toolBar);d_chart->setOrientation(orientationBox->currentIndex());connect(orientationBox,SIGNAL(currentIndexChanged(int)),d_chart,SLOT(setOrientation(int)));}intmain(intargc,char**argv){QApplicationa(argc,argv);MainWindowmainWindow;mainWindow.resize(600,400);mainWindow.show();returna.exec();}

3、barchart.h文件如下:#ifndef_BAR_CHART_H_#include<qwt_plot.h>#include<qstringlist.h>classDistroChartItem;classBarChart:publicQwtPlot{Q_OBJECTpublic:BarChart(QWidget*=NULL);publicQ_SLOTS:voidsetOrientation(int);voidexportChart();private:voidpopulate();DistroChartItem*d_barChartItem;//自定义直方图类QStringListd_distros;//改变方向重置标题用};#endif

4、barchat.cpp代码如下:#include"barchart.h"#include<qwt_plot_renderer.h>#include<qwt_plot_canvas.h>#include<qwt_plot_barchart.h>#include<qwt_column_symbol.h>#include<qwt_plot_layout.h>#include<qwt_legend.h>#include<qwt_scale_draw.h>classDistroScaleDraw:publicQwtScaleDraw{public:DistroScaleDraw(Qt::Orientationorientation,constQStringList&labels):d_labels(labels){setTickLength(QwtScaleDiv::MinorTick,0);setTickLength(QwtScaleDiv::MediumTick,0);setTickLength(QwtScaleDiv::MajorTick,2);enableComponent(QwtScaleDraw::Backbone,false);if(orientation==Qt::Vertical){setLabelRotation(-60.0);}else{setLabelRotation(-20.0);}setLabelAlignment(Qt::AlignLeft|Qt::AlignVCenter);}//刻度标签值virtualQwtTextlabel(doublevalue)const{QwtTextlbl;constintindex=qRound(value);//四舍五入if(index>=0&&index<=d_labels.size()){lbl=d_labels[index];}returnlbl;}private:constQStringListd_labels;};//直方图//QwtPlotBarChart将一系列数据显示为barclassDistroChartItem:publicQwtPlotBarChart{public:DistroChartItem():QwtPlotBarChart("PageHits"){setLegendMode(QwtPlotBarChart::LegendBarTitles);//显示所有bar各自的标题,而QwtPlotBarChart::LegendChartTitle显示这个表的标题setLegendIconSize(QSize(10,14));}//分配颜色和标题给bar,并更新voidaddDistro(constQString&distro,constQColor&color){d_colors+=color;d_distros+=distro;itemChanged();//Updatethelegendoftheparentplot.}//自定义每个BarvirtualQwtColumnSymbol*specialSymbol(intindex,constQPointF&)const{QwtColumnSymbol*symbol=newQwtColumnSymbol(QwtColumnSymbol::Box);symbol->setLineWidth(1);symbol->setFrameStyle(QwtColumnSymbol::Plain);//RaisedQColorc(Qt::white);if(index>=0&&index<d_colors.size())c=d_colors[index];symbol->setPalette(c);returnsymbol;}//自定义每个bar的标题virtualQwtTextbarTitle(intsampleIndex)const{QwtTexttitle;if(sampleIndex>=0&&sampleIndex<d_distros.size())title=d_distros[sampleIndex];returntitle;}private:QList<QColor>d_colors;QList<QString>d_distros;};BarChart::BarChart(QWidget*parent):QwtPlot(parent){conststruct{constchar*distro;constinthits;QColorcolor;}pageHits[]={{"Arch",1114,QColor("DodgerBlue")},{"Debian",1373,QColor("#d70751")},{"Fedora",1638,QColor("SteelBlue")},{"Mageia",1395,QColor("Indigo")},{"Mint",3874,QColor(183,255,183)},{"openSuSE",1532,QColor(115,186,37)},{"Puppy",1059,QColor("LightSkyBlue")},{"Ubuntu",2391,QColor("FireBrick")}};setAutoFillBackground(true);setPalette(QColor("Linen"));//设置画布QwtPlotCanvas*canvas=newQwtPlotCanvas();canvas->setLineWidth(2);canvas->setFrameStyle(QFrame::Box|QFrame::Sunken);canvas->setBorderRadius(10);QPalettecanvasPalette(QColor("Plum"));canvasPalette.setColor(QPalette::Foreground,QColor("Indigo"));canvas->setPalette(canvasPalette);setCanvas(canvas);setTitle("DistroWatchPageHitRanking,April2012");d_barChartItem=newDistroChartItem();//数据源QVector<double>samples;for(uinti=0;i<sizeof(pageHits)/sizeof(pageHits[0]);i++){d_distros+=pageHits[i].distro;//给标题赋值samples+=pageHits[i].hits;//给数据赋值d_barChartItem->addDistro(pageHits[i].distro,pageHits[i].color);//更新颜色和标题}d_barChartItem->setSamples(samples);//更新数据d_barChartItem->attach(this);insertLegend(newQwtLegend());setOrientation(0);setAutoReplot(false);}voidBarChart::setOrientation(into){constQt::Orientationorientation=(o==0)?Qt::Vertical:Qt::Horizontal;intaxis1=QwtPlot::xBottom;intaxis2=QwtPlot::yLeft;if(orientation==Qt::Horizontal)qSwap(axis1,axis2);d_barChartItem->setOrientation(orientation);//直方图方向d_barChartItem->setSpacing(20);//spacing是两个样本之间的距离(两个直方图之间的距离,或者每组直方图之间的距离d_barChartItem->setMargin(30);//margin最外层的直方图与画布的边框矩形之间的距离setAxisTitle(axis1,"Distros");setAxisMaxMinor(axis1,3);//设置坐标轴小刻度的最大值setAxisMaxMajor(axis1,10);//设置坐标轴大刻度的最大值setAxisScaleDraw(axis1,newDistroScaleDraw(orientation,d_distros));//需要重新更新标题setAxisTitle(axis2,"Hitsperday(HPD)");setAxisMaxMinor(axis2,3);QwtScaleDraw*scaleDraw=newQwtScaleDraw();scaleDraw->setTickLength(QwtScaleDiv::MediumTick,4);setAxisScaleDraw(axis2,scaleDraw);plotLayout()->setCanvasMargin(0);replot();}voidBarChart::exportChart(){QwtPlotRendererrenderer;renderer.exportTo(this,"distrowatch.pdf");}

热门搜索
邪恶少女漫画里番库 蓝天图片 艳母漫画 水图片 萌宠图片