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

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 }

站在生活最亮的地方,成熟了让自己不断变强头条创作挑战赛站在最亮的地方(原创诗一首)成熟的信念让自己变强,可以站在生活最亮的地方,笑对前进的征程,心中常驻着灿烂的阳光。点燃生活每一份希望,酿造出生活甜蜜的馨香,像儿时那个喜听书我最近开始听书了,或许有人说你这不是老了吗!是啊,每个年龄就有每个年龄干的事。还记得我们校长说过的话小时候喜欢看书,没钱买书,只好跟别人借书看,工作之后挣钱了,有钱买书了,可是没时忆父亲1。清明,忆父亲伫立在父亲墓前,那些一年前处理掉的荒草,经过四季的洗礼又开始蓬勃生长,萋萋而立。父亲的墓碑没有相片,只有墓铭,看着熟悉的名字,往事裹挟着有关父亲的记忆扑面而来!父亲重新开始寻找这是去年国庆(2022102)写的旧文,当时觉得会发不出来,就放下了。现借春节假期稍作修改,在三年疫情或将消散之际,作为重拾公众号后的首篇再发生民多艰,众生皆苦,是我这几年的真实感新的一年,学会更好地挣钱,花钱,攒钱人的一生离不开一个钱字,正所谓有钱男子汉,没钱汉子难。每天早晨一睁眼,柴米油盐酱醋茶,哪一样离得开钱呢?更何况处于现在这个物欲横流,骚动不安的社会,外面的物质诱惑实在是太多了。谁不夏威夷夜空惊现神秘螺旋状发光体,被指与马斯克有关极目新闻记者满达实习生张佳怡据纽约邮报1月30日报道,本月早些时候,在夏威夷的夜空中发现了一个神秘的螺旋状发光体,引发了观察者的好奇心。螺旋状发光体(图源推特)这一奇观最初于1月1超三成省市属国资电力公司预亏,粤电力A豫能控股亏损最多实习记者王诗涵据界面新闻不完全统计,开年以来,已有25家省市属国资控股的电力上市公司,以预告或快报的形势披露2022年度业绩。其中,八家公司净利预亏,占比超三成。这八家公司分布在浙烟台东诚北方制药有限公司开足马力满负荷生产药品来源烟台日报大小新闻大小新闻客户端1月29日讯(YMG全媒体记者童佳怡通讯员闫奇琪姜乾摄影报道)1月28日上午9时,走进烟台东诚北方制药有限公司生产车间,机器轰鸣,人员忙碌,每隔几2022年创业板公司推出股权激励计划248单记者从深圳证券交易所获悉,2022年,深市上市公司推出的股权激励和员工持股计划数量和规模稳步增长。其中创业板公司共推出股权激励计划248单,占深市全部股权激励计划的63推出员工持股展望2023年中国爱因斯坦探针升空,全球近20个科学任务发射科技导报人类在浩瀚的宇宙面前是渺小的,但人类的空间科学探索精神是伟大的。空间科学以航天器为主要平台,研究发生在地球日地空间行星际空间乃至整个宇宙空间的物理化学及生命等自然现象及其规律。卫星2022年12月亚洲(中国)长租公寓发展报告本文来自微信公众号空间秘探(IDMESPACE007),作者ABNData。公寓市场综述01全球公寓市场发展动态美国全国房地产经纪人协会(NationalAssociationof
众泰60亿杀入新能源,曾被国人骂到破产的中华神车要复活了?作者子成在消失了两年多之后,众泰终于又回来了。如果你有关注就会发现,在这段消失的日子里,众泰汽车是死而不亡,一边努力重整,复活的消息隔三差五就会出现,一边在股市场上作妖,过去一年半品读活了105岁的杨绛先生,我们真的能主宰自己的人生吗?这些年,我一直一种无能为力感,觉得自己能掌控的事情太少。纵使自己百般努力,左冲右突,总是会有这种或者那种意外打乱自己的规划,这些意外有些是自身的原因,有些是外面的原因,总让人忙于应一些乱七八糟的文案只记得都很舍不得,但是都很理智知道不可能再继续。面对现实扼杀了很多爱情。Ijustrememberthattheyarereluctanttogiveup,buttheyareve左宗棠的5句话,最好能背下来01hr世上最大的悲剧,是后人蠢而多财人在一个地方得到,老天必会在另外一个地方让你失去,以实现总体平衡。这种因果,有时是当代出现,有时会隔代循环。2卑贱时锋芒毕露,富贵时谨小慎微没早安所有的美好都在路上,永远奔向最美好的自己太阳早安今天太阳今天是2022年6月24日,星期五,农历五月廿六今天做好的事情,将改善未来的每一天。悄悄努力,保持开心,用最期待的方式去热爱生活。快乐在发酵,生活在前行,所有的美好学生党购机推荐!FindX5Pro券后4989元起,双芯配置性能强劲近日,全国各地的高考开始放榜。这也意味着,寒窗苦读12年的高三学子们,终于迎来了最终的结果,接下来就是为大学做准备了。其中,智能手机作为现代人生活娱乐,还有学习的主要工具,自然而然黑科技3C好物盘点,从相机耳机到投影仪都有,实用才是关键黑科技是小米CEO雷军喜欢使用的形容词,也是众多索尼粉丝用来形容索尼产品的惯用词!黑科技这三个字来源于动漫全金属狂潮,意思是指那些超出当下人类的知识范畴和科技认知以外的科学和产品!联发科天玑9000多核跑分超4300,安卓最强CPU非它莫属上半年联发科天玑9000的推出,让今年的手机旗舰市场格局突变,为消费者提供了更好的选择。联发科最新推出的天玑9000芯片,似乎又要更上一层楼。天玑9000CPU在GeekBench华为Nova新机海外发布骁龙680加持,畅享50Pro套娃版?据外媒报道,华为在海外发布一款NovaY90新机,外观撞脸Mate40系列颜值颇高,参数与国内即将亮相的畅想50Pro高度相似。按照惯例,两款手机应该属于套娃版本,华为也不是第一次从入门到专业佳能全画幅微单应该如何选择随着微单相机逐渐成为影像市场的主导后,不论是新用户购买首台相机,还是单反相机的老用户,面对市场上种类繁多的微单相机,我们该如何选择呢?今天这篇文章,我们就以佳能EOSR系列专微相机电视维修上门丨电视机遥控器配对怎么解决?遥控器大家知道吗?大家对于电动门遥控器配对方法有什么了解呢?电动门遥控器怎么配对呢?电动门遥控器怎么配对有什么需要注意的地方吗?下面就为大家介绍一下电动门遥控器怎么配对的相关信息,