范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Qt之自绘制饼图

  1、说明
  最近在搞绘图方面的工作,说实话C++的第三方绘图库并不算多,总之我了解的有:qtcharts、ChartDirector、qwt、kdchart和QCustomPlot。这几个库各有利弊。 qtcharts:qt5.7之后才开源的模块,支持绘制各种图标,并且功能相当丰富,但是可扩展性差,如果自己想高度定制,比较困难,主要是和qt的源码风格有决定性的关系。 ChartDirector:开源的第三方绘图库,使用方便,推荐使用 qwt:主要绘制仪表盘类似的东西(这个库可以编译后加入qt帮助文档) kdchart:不仅可以绘制图表,而且可以绘制甘特图,功能也都挺好使,我个人之前在qt4.7的时候使用过 QCustomPlot:简答的绘图库,因为只有两个文件,如果想高度定制我个人推荐这个靠谱,毕竟理解起来容易些 2、效果展示
  下边是绘制的饼图展示效果,当然了不能满足大多数人的需要,我主要是在这里提供一种思路,如果需要在绘制上有所调整的小伙伴可以下载demo自行修改。
  图1 展示图1
  图2 展示2
  图3 展示图3 3、思路分析
  上边三张展示图,如果要说从理解难以成都来说,展示图3是比较容易理解。下边我就几个需要注意的细节描述下: 图表矩形距离边框距离,影响图表绘制矩形的因素 图表绘制方向,默认是逆时针 图表文本描述位置 legend描述位置,demo中已经提供了接口,可以支持不同legend的展现形式 箭头长短 空心饼图(圆环图)
  饼图绘制关键步骤: 添加数据项->构造数据缓存->绘制图表 窗口大小变化->构造数据项矩形->构造数据缓存->绘制图表
  点击领取Qt学习资料+视频教程~「链接」
  4、源码解说
  首先来看两个结构体,主要是用来缓存数据,PieItemPrivate存储的是每一个item项的内容,包括item的legend,文本、颜色、值和一些辅助的结构体;PieChartPrivate结构是饼图类的私有数据存储结构,具体含义看注释  1 struct PieItemPrivate  2 {  3     PieItem item;//用户插入数据时的结构,包括注释、值和颜色  4     QPainterPath path;//项绘制时区域  5     QPoint labelPos;//文本位置  6     QRect m_LegendRect;//legend的矩形  7 };  8   9 struct PieChartPrivate 10 { 11     bool m_bLegendVisible = false;//是否显示图例 12     int m_Minx = 25;//左右最小边距 13     int m_Miny = 25;//上下最小边距 14     int m_MinDiameter = 130;//饼图最小直径 15     int m_RingWidth = 0;//如果是环,环的宽度 16     int m_StartRotationAngle = 0;//绘制item项的时候,其实角度 17     int m_LegendWidth = 100;//图表宽度  可以在插入新数据项的时候更新,计算展示legend所需要的最小尺寸 18     int m_LegendHeight = 30;//图例高度  可以在插入新数据项的时候更新,计算展示legend所需要的最小尺寸 19     double m_SumValue = 0;//所有item的value和 20     QRect m_PieRect;//饼图绘制矩形 21     QColor m_LabelColor = QColor(0, 0, 0);//百分比文字颜色 22     QString m_RingLabel = QStringLiteral("饼图");//图表中心文字描述 23     QVector m_Items;//图表项 24 };
  1、当有新数据或者窗口大小发生变化时,计算数据缓存  1 void PieChart::ConstructData()  2 {  3     int pos = d_ptr->m_StartRotationAngle;  4     int angle;  5     QPainterPath subPath;  6     subPath.addEllipse(d_ptr->m_PieRect.adjusted(d_ptr->m_RingWidth, d_ptr->m_RingWidth, -d_ptr->m_RingWidth, -d_ptr->m_RingWidth));  7       8     for (auto iter = d_ptr->m_Items.begin(); iter != d_ptr->m_Items.end(); ++iter)  9     { 10         angle = 16 * iter->item.value / d_ptr->m_SumValue * 360; 11      12         QPainterPath path; 13         path.moveTo(d_ptr->m_PieRect.center()); 14         path.arcTo(d_ptr->m_PieRect.x(), d_ptr->m_PieRect.y(), d_ptr->m_PieRect.width(), d_ptr->m_PieRect.height(), pos / 16.0, angle / 16.0); 15         path.closeSubpath(); 16          17         if (d_ptr->m_RingWidth > 0 && d_ptr->m_RingWidth <= d_ptr->m_PieRect.width() / 2) 18         { 19             path -= subPath; 20         } 21          22         iter->path = path; 23  24         double labelAngle = (pos + angle / 2) / 16; 25         double tx = (d_ptr->m_PieRect.width() - d_ptr->m_RingWidth) / 2 * qCos(labelAngle / 360 * 2 * 3.1415926); 26         double ty = -(d_ptr->m_PieRect.width() - d_ptr->m_RingWidth) / 2 * qSin(labelAngle / 360 * 2 * 3.1415926); 27  28         iter->labelPos = QPoint(tx, ty) + d_ptr->m_PieRect.center(); 29  30         pos += angle; 31     } 32 }
  2、当窗口大小发生变化时,重新计算各项所在矩形,ConstructRect方式是用来计算各子项矩形区域的,内部调用ConstructCornerLayout方法是生产制定的布局,有兴趣的小伙伴可以写自己的矩形区域计算方式,开达到不同的绘制效果。  1 void PieChart::ConstructRect(const QSize & size)  2 {  3     switch (d_ptr->m_Items.size())  4     {  5     case 4:  6         ConstructCornerLayout(size);  7     default:  8         break;  9     } 10 } 11 //该方法是针对4个legend,并且在四角的位置所计算的布局方式,小伙伴也可以实现自己的布局计算,然后在ConstructRect接口中调用 12 void PieChart::ConstructCornerLayout(const QSize & size) 13 { 14     int currentR = d_ptr->m_MinDiameter; 15     int diameter; 16     int horiWidth = size.width(); 17     if (d_ptr->m_bLegendVisible) 18     { 19         horiWidth -= d_ptr->m_LegendWidth * 2; 20     } 21  22     if (horiWidth > size.height()) 23     { 24         diameter = size.height(); 25     } 26     else 27     { 28         diameter = horiWidth; 29     } 30  31     int x, y; 32     int r = diameter - d_ptr->m_Minx * 2; 33     currentR = r > currentR ? r : currentR; 34     if (d_ptr->m_bLegendVisible) 35     { 36         x = d_ptr->m_Minx + d_ptr->m_LegendWidth; 37         y = (size.height() - currentR) / 2; 38       //计算4个legend位置 39         d_ptr->m_Items[1].m_LegendRect = QRect(d_ptr->m_Minx, d_ptr->m_Miny, d_ptr->m_LegendWidth, d_ptr->m_LegendHeight); 40         d_ptr->m_Items[0].m_LegendRect = QRect(x + r, d_ptr->m_Miny, d_ptr->m_LegendWidth, d_ptr->m_LegendHeight); 41         d_ptr->m_Items[3].m_LegendRect = QRect(x + r, size.height() - d_ptr->m_Miny - 30, d_ptr->m_LegendWidth, d_ptr->m_LegendHeight); 42         d_ptr->m_Items[2].m_LegendRect = QRect(d_ptr->m_Minx, size.height() - d_ptr->m_Miny - 30, d_ptr->m_LegendWidth, d_ptr->m_LegendHeight); 43     } 44     else 45     { 46         x = d_ptr->m_Minx; 47         y = d_ptr->m_Miny; 48     } 49  50     d_ptr->m_PieRect = QRect(x, y, currentR, currentR);//计算饼图位置 51 }5、测试代码 1 int main(int argc, char *argv[])  2 {  3     QApplication a(argc, argv);  4   5     PieChart w;  6     w.AddData(100, Qt::red, "red");  7     w.AddData(100, Qt::green, "green");  8     w.AddData(100, Qt::blue, "blue");  9     w.AddData(100, Qt::gray, "gray"); 10     w.show(); 11  12     return a.exec(); 13 }

很多人负债以后走不出来有些人做生意失败以后,三年,五年,甚至更久都无法走出来,整天的沉浸在懊恼,自责,悔恨当中,这时候要及时止损,跟过去做一个停止线,你以前所有的努力,所有的付出,5年,8年,10年,在万事不求人,一生靠自己人的一生当中,到底是否需要求人?求人是否有用?哪些人不能求?哪些人不用求呢?有人说,万事不求人是一种性格缺陷,也是一种个人英雄主义的表现,凡成大事者都是善于求人的。其理由就是人都是让情侣感动的早安语早安励志温暖心语1能够遇见你,对我来说是最大的幸福。2不管天的变化莫测,我对你的爱无怨无悔。3像我这么瞎的男人可不多,你要珍惜我一点。4向来没耐心的我,在你身边徘徊了这么久。5最美莫过于未来有一天发照片的时候用的文案一多喝养乐多,把快乐养多多。Drinkmoreandkeepmorejoy,keepmorehappiness。二世界会不会变好不重要,你要变好才重要。Itdoesntmatter早上好!一心一意的祝福送给你,愿你一生幸福健康平安余生很贵,努力活成自己想要的样子,熬过所有艰难的日子,就会迎来阳光明媚的未来,如果生活一定要取悦一个人,我们最应该取悦的是自己,随着心的方向走,看到别人的光芒,也知道自己的耀眼。不墨西哥为何向美国军火商讨说法?近期,墨西哥打定主意,要向美国军火商讨说法。上月底,美国马萨诸塞州一名联邦法官驳回了墨西哥去年针对美国军火商提起的诉讼。在该起诉讼中,墨西哥方面控告11家美国军火商因渎职和非法商业如何定量描述顺磁介质的磁化?张朝阳的物理课推导磁化强度公式顺磁介质的磁化强度与什么有关?如何利用玻尔兹曼分布推导磁化强度公式?10月28日12时,张朝阳的物理课第九十六期开播,搜狐创始人董事局主席兼CEO张朝阳坐镇搜狐视频直播间,先复习了记忆中的那片田记忆中的那片田在老家,老家在一个不太大的山坳里,由于地势起伏并非平坦,准确地说,不能称作为一片田,只能叫一湾田或者是一峪田。在我的记忆中,家门口田里的禾苗长了,我也长了,油菜长高了游族网络2022年前三季度净利润7403。25万元同比下降79。10中证智能财讯游族网络(002174)10月28日披露2022年第三季度报告。2022年前三季度,公司实现营业总收入14。62亿元,同比下降41。87归母净利润7403。25万元,同现代酒圈怪象不追求名酒,反而对这5款酒情有独钟不知道大家有没有发现这样一个现象前几年的炫富景象,如今很少了,反而开始炫耀自己薅羊毛的能力,而且互相攀比谁的东西便宜又好用。当然白酒界也不例外。几年前,以茅台五粮液为主流,逢人便炫智慧,就是把握人的劣根性1。人人都在追求快,可我却追求慢。快了就容易慌不择路,饥不择食。快了就会不经过脑子,只要慢下来,大脑才跟得上,做事情才经过大脑。孙子说,后人发先人至,此知迂直之计者也。2。成熟的人
四川新闻联播丨省委省政府印发关于优化生育政策促进人口长期均衡发展的实施方案视频加载中近日,省委省政府印发关于优化生育政策促进人口长期均衡发展的实施方案,并发出通知,要求各地各部门结合实际贯彻落实。实施方案提出,要实施三孩生育政策及配套支持措施,推动实现适二手车市场回暖,今年交易量有望跃上2000万辆台阶今年以来,二手车市场利好政策频出。全面取消二手车限迁二手车转移登记实行单独签注以及规范二手车交易等政策,将加快二手车领域的流通。中国汽车流通协会方面10月9日表示,预计今年全国二手我的阿姨被人以1万月薪挖走了!雇主千金难求好阿姨,家政服务市场需求旺点蓝字关注,不迷路我又要开始找阿姨了,为啥找个稳定的阿姨这么难!近日,家住深圳的二胎妈妈曾丽(化名)很是发愁,二宝出生的四个月里,她已经换了三个育儿嫂(以下简称阿姨)。近年来,随着中国手机市场Q4大变局国内手机出货量或现新迷局在Q1Q3连续三个季度国内手机出货量连续低迷之后,Q4的国内手机出货量更是引人关注。虽然现在还只是十月,Q4的帷幕刚刚拉开,但在市场上,随着iPhone14系列的上市,Mate50文化活起来体验多起来旅游演艺创新绽放这是10月6日在海南儋州峨蔓火山海岸拍摄的海南环岛旅游公路(无人机照片)。新华社发旅游演艺是文化和旅游融合发展的重要载体,从剧院演出到实景演出,再到沉浸式互动演出,丰富创新的表现形黄山市文明赋能城市更美好生活更幸福黄山市是闻名遐迩的旅游城市,随着城市发展变迁,黄山的秀美风光与城市景观相融相生,造就了特色鲜明宜居宜业的美好家园,为黄山市赋予了独特的文明韵味。党的十八大以来,黄山市坚持以习近平新跨界融合,扬帆远航致贺红蓝融合公众号开通运行跨界融合,扬帆远航致贺红蓝融合公众号开通运行值此举国欢度国庆假日后的首个工作日全国人民喜迎二十大胜利召开时节,隆重致贺红蓝融合公众号通过主管部门审批,正式登台亮相,开启新使命,奋进23!女排世界第9爆冷出局,世锦赛八强形势2队争夺最后1席北京时间2022年10月9日,女排世锦赛继续进行,F组结束了复赛最后一轮的较量,世界排名第9位的多米尼加23不敌加拿大,爆出大冷门。多米尼加输掉了生死战,提前无缘八强,这一结果也让中国挺起了脊梁推开窗户,流光溢彩,美不胜收啊!这一砖一瓦都是我们中国人自己双手磊上去的,光洁的马路都是中国人铺就的,美丽的华灯也自己设计安装的。谁知道今日的繁华背后有多少辛酸和屈辱,远的就不说了老头卖猪肉,浅色和深色区别大同样是猪肉,看完再买不吃亏大家好,我是大雄。当我们在市场上去购买猪肉的时候,为什么有些会颜色深有些会颜色浅呢?出现这样的原因,到底又是为什么?这些颜色不同的猪肉,要怎么去挑选才能从里面买到,更优质的肉呢?今新版职业教育专业目录调整幅度超60学生成长通道更明确视觉中国供图日前,教育部发布新版职业教育专业简介(以下简称新版简介),该版简介服务产业转型升级的需要,展现职业教育专业升级与数字化改造的最新成果,覆盖新版专业目录全部19个专业大类