首页 > 作文

Qt使用QWT绘制柱状图详解

更新时间:2023-04-04 18:04:30 阅读: 评论:0

目录
1:设置qchart的整体背景色2:设置有效区域的背景色3:设置x、y坐标轴数据4:设置网格线5:插入实际数据6:x轴刻度值优化7:设置x轴文本偏移8:设置每个柱状体的宽度9:设置每个柱状体的偏移量10:修改鼠标的显示状态

有的时候我们会遇到这样一种功能,需要在柱状图中显示不同颜色的柱状体,每个主状态代表的状态不同,那么如果只是用简单的qchart是难以实现的。

qt中提供了一个叫做qwt的库。qwt,全称是qt widgets for technical applications,是一个基于lgpl版权协议的开源项目,可生成各种统计图。它为具有技术专业背景的程序提供gui组件和一组实用类,其目标是以基于2d方式的窗体部件来显示数据,数据源以数值,数组或一组浮点数等方式提供,输出方式可以是cur可乐姜汤的作用ves(曲线),slider(滚动条),dials(圆盘),compass(仪表盘)等等。该工具库基于qt开发,所以也继承了qt的跨平台特性。

下面介绍的实现效果如下所示:

主要难实现功能:

1:柱状图实现了一类下有多种颜色显示,

2:文本、每个柱状体可以进行偏移

3:修改柱状体的宽度

4:修改有效图表的鼠标显示状态

qwt中给的example例子也可以实现一种类型对应多种颜色的柱状图,但是,无法实现文字以及柱状图的偏移。

很明显,当前效果图的文本以及柱状图显示在了网格中间。如果有博友想实现和我一样的效果,那就请继续往下看。

该效果我是在example的例子基础上进行改进的,其中基本框架不变,在我看来,没有实现不了的功能,只有你对这个库的熟悉程度,该功能代码简单,但是还是耗费了我三天的时间。

下面我进行功能讲解

1:设置qchart的整体背景色

m_pchart->tautofillbackground(true);m_pchart->tframestyle(qframe::noframe);m_pchart->tlinewidth(0);m_pchart->tpalette(qcolor(255, 255, 255));

2:设置有效区域的背景色

qwtplotcanvas *canvas = new qwtplotcanvas();canvas->tframestyle(qframe::noframe);m_pchart->tcanvas(canvas);

3:设置x、y坐标轴数据

当前x轴显示的是0-30条数据,y轴是0-8条数据

m_pchart->t实战销售axisscale(qwtplot::xbottom, 0, 30);m_pchart->taxismaxmajor(qwtplot::xbottom, 30);m_pchart->taxismaxminor(qwtplot::xbottom, 0);m_pchart->taxisscale(qwtplot::yleft, 0, 8);m_pchart->taxismaxmajor(qwtplot::yleft, 6);m_pchart->taxismaxminor(qwtplot::yleft, 2);

这是设置x、y轴的基本设置,如果想要设置字体呢?如下:

qfont fontx;fontx.tfamily(qstringliteral("微软雅黑"));fontx.tpointsize(12);m_pchart->taxisfont(qwtplot::xbottom, fontx);

在此处,我只是显示了x轴的字体设置,y轴同理,就不显示了。

4:设置网格线

qwtplotgrid *grid = new qwtplotgrid;grid->tmajorpen(qcolor(193, 193, 193), 1, qt::solidline);grid->attach(m_pchart);

如果按照当前代码设置网格时,大家会发现,中间刻度没有网格线显示,效果如下图所示:

如果有需要类似功能的,仅用上面代码就可以实现。但是,有人却说,想要中间刻度也有网格线显示,那么,使用以下代码实现

qwtplotgrid *grid = new qwtplotgrid;grid->enablexmin(true);grid->enableymin(true);grid->tmajorpen(qcolor(193, 193, 193), 1, qt::solidline);grid->tminorpen(qcolor(193, 193, 193), 1, qt::solidline);grid->attach(m_pchart);

强制显示网格线的中间刻度网格线。经过设置之后,就和1-1图一致,根据大家需求自行设置。

5:插入实际数据

当前操作是在柱状图中插入数据,可以对每一条柱状体进行颜色设置,实现代码:

m_pchartitemair = new custombarchartitem();qstringlist listpdata;qvector<double> vetsample;for (int i = 0; i < vetcolordata.size(); i++){    colordata stinfo = vetcolordata[i];    vet分隔号sample.append(stinfo.nnum);    qstring stext = qstring::number(i+1, 10);    listpdata.append(stext);    qcolor color = stinfo.color;    m_pchartitempress->inrtbardata(stext, color);}//数据插入之后,进行绑定m_pchartitempress->tsamp漏网之鱼les(vetsample);m_pchartitempress->attach(m_pchartpress);

custombarchartitem该类是我对qwtplotbarchart类的重写。

其中,inrtbardata()该函数设置了每个柱状体对应的不同颜色值。

插入数据之后,进行数据绑定。

inrtbardata()中调用qwtplotbarchart::itemchanged(),让类中自动调用specialsymbol() 该函数进行颜色值更改

qwtcolumnsymbol * custombarchartitem::specialsymbol(int sampleindex, const qpointf&) const{//todo: 我们希望每个条形都有不同的颜色custombarchartcolumnsymbol *symbol = new custombarchartcolumnsymbol(qwtcolumnsymbol::box);symbol->tframestyle(qwtcolumnsymbol::noframe);symbol->tcolumnmovelen(m_nmovelen);qcolor currentcolor(qt::white);qstring shit = "";if ((sampleindex >= 0) && (sampleindex < m_listcolor.size())){    currentcolor = m_listcolor[sampleindex];    shit = m_listlabel.at(sampleindex);}symbol->tpalette(currentcolor);return symbol;}

实现改变颜色的核心代码是:symbol->tpalette(currentcolor);

6:x轴刻度值优化

custombarchartscaledraw *pscaledraw = new custombarchartscaledraw(qt::orientation::horizontal, listpresslabel);pscaledraw->txbottommovelens(10);m_pchart->taxisscaledraw(qwtplot::xbottom, pscaledraw);

其中,taxisscaledraw的第一个参数是控制,是x轴?y轴

当前custombarchartscaledraw类是我对qwtscaledraw的重写

7:设置x轴文本偏移

第6步骤中,txbottommovelens()函数实现的功能就是对x轴文本进行偏移。

8:设置每个柱状体的宽度

tlayoutpolicy(fixedsamplesize);tlayouthint(nwidth); //设定了柱状体的宽度

9:设置每个柱状体的偏移量

写到这里,大家会发现,运行之后,效果差强人意,如图所示。

每个柱状图都在网格的垂直线上,而且第一位还显示不全,看起来很是不舒服。下面需要设置对柱状图的偏移,这个功能可真是不好改,改了一天才弄好 -_-||

修改柱状图的偏移需要在qwtcolumnsymbol类中进行修改,那么重写该类,叫做custombarchartcolumnsymbol这个名字,对draw函数进行重载

virtual void draw(qpainter *painter, const qwtcolumnrect &rect) const;

加入qwt源码之后,可以查看到draw函数的实现,我们需要仿照源码中进行实现,只是修改下显示位置。因为在qwtcolumnsymbol中,修改柱状图区域的类未对外开放,所以,只能依靠draw的qwtcolumnrect 类进行修改。

当draw在调用drawbox函数时,需要将修改的qwtcolumnrect的区域传给父类,这样就会修改显示位置。

直接上代码更直接一些

void custombarchartcolumnsymbol::draw(qpainter *painter, const qwtcolu常用日语1000句mnrect &rect) const{qwtcolumnrect rectnew = rect;if (m_nmovelens > 0){int nmin = rectnew.hinterval.minvalue() + m_nmovelens;rectnew.hinterval.tminvalue(nmin);int nmax = rectnew.hinterval.maxvalue() + m_nmovelens;rectnew.hinterval.tmaxvalue(nmax);}painter->save();switch (this->style()){ca qwtcolumnsymbol::box:{drawbox(painter, rectnew);}break;default:;}painter->restore();}

修改的位置,其实是对qwtcolumnrect的 qwtinterval hinterval; 进行修改。因为实现的是需要对x轴进行偏移,所以只对该参数进行修改,其余按照父类的draw进行实现。

custombarchartcolumnsymbol的代码实现

custombarchartcolumnsymbol::custombarchartcolumnsymbol(style sstyle/* = nostyle*/) :qwtcolumnsymbol(sstyle){m_nmovelens = 0;}custombarchartcolumnsymbol::~custombarchartcolumnsymbol(){}void custombarchartcolumnsymbol::tcolumnmovelen(int nmovelen){m_nmovelens = nmovelen;}void custombarchartcolumnsymbol::draw(qpainter *painter, const qwtcolumnrect &rect) const{qwtcolumnrect rectnew = rect;if (m_nmovelens > 0){int nmin = rectnew.hinterval.minvalue() + m_nmovelens;rectnew.hinterval.tminvalue(nmin);int nmax = rectnew.hinterval.maxvalue() + m_nmovelens;rectnew.hinterval.tmaxvalue(nmax);}painter->save();switch (this->style()){ca qwtcolumnsymbol::box:{drawbox(painter, rectnew);}break;default:;}painter->restore();}

其中,偏移位置的大小是由 tcolumnmovelen进行设置的。

10:修改鼠标的显示状态

canvas->tcursor(qt::arrowcursor); //修改鼠标在画布上的显示方式,系统默认是十字架形状

在实现过程中,大家会发现,实现的网格效果和我的有些不一致,网格线并没有呈现闭合状态,可以使用以下代码实现

m_pchart->plotlayout()->taligncanvastoscales(true);

到此这篇关于qt使用qwt绘制柱状图详解的文章就介绍到这了,更多相关qt qwt柱状图内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 18:04:28,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/c4d0be3476c8e05c3fb18d53d8e796ac.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Qt使用QWT绘制柱状图详解.doc

本文 PDF 下载地址:Qt使用QWT绘制柱状图详解.pdf

标签:柱状   网格   数据   柱状图
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图