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

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 }

刘畊宏卖假货翻车,这次真的凉凉?事情没这么简单8月30日,一则关于辛巴发长文爆料刘畊宏夫妇卖假货的话题登上了热搜。巧的是,当晚刘畊宏直播健身时,因为大家对他的支持哭了。关于刘畊宏被暴出卖假货的热搜阅读量高达5亿大众对翻车卖假货因为和男朋友赌气,穿着性感泳衣和他的五个好兄弟去游泳头条创作挑战赛游泳别看我离开球场时十分洒脱,可真到了女更衣室,我拿着这件黑色的性感游泳衣左思右想,到底是穿还是不穿?要不还是打电话给男朋友,让他过来一起啊?想了想,还是不打了。他打中俄日本海军演对两岸统一的含义,高安国东西三战对叠雏形成立文高安国自9月1日开始为期一周的东方2022联合军演在日本海举行,参加者包括中国俄罗斯印度塔吉克斯坦白俄罗斯叙利亚蒙古等国家。本次军演由俄罗斯主办,参演人员包括5万多名军事人员。俄拜托,别什么都发到朋友圈好吗,啊哈哈哈哈笑抽了朋友圈里总有那么一群人牺牲小我,成全大众每日在朋友圈里发布自己的搞笑故事一起来看看吧1。我读书少你可别骗我酸2。比说世界上根本没有奥特曼的杀伤力还大3。亲生的亲生的4。得,继上条之为什么没有人尊重你呢?周围的人不喜欢你你走吧!除了我看谁还要你?这句话出自于男子说出口的,女子就在旁边哭,不敢离开,不难想象当时的画面,简直无语了。结婚都是抱着幸福的日子去,不是让你觉得自己了不起,以为嫁了人就不值钱,小故事大道理从前有个木医,给老板干了一辈子,老了身体不行了,想回家休养了,老板叫他再盖一座房子再走,他答应了。但老木匠此时心思己不在建房上了,工作马马虎虎,得过且过,敷衍了事,干活偷工减料。房殷殷重托记心上雅尼湿地展新颜中国西藏网讯位于雅鲁藏布江与尼洋河交汇处的雅尼国家湿地公园,是习近平总书记在2021年考察西藏的第一站。2021年7月21日上午,刚刚抵达林芝米林机场的习近平总书记来到尼洋河大桥,历史上曾神秘消失的5个人,3男2女,至今不知他们去了哪里?头条创作挑战赛伴着鸟叫声一名老者从南山脚下由远及近而来,夕阳余晖透过树影片片洒在他的肩头。他随手取下檐帽拿在手里扇风,扛着锄头也不着急回家,往路旁邻居家的地里打量。想到自家地里稀疏湖南一醉酒女子撞人后竟拖行一公里,伤者惨不忍睹,现场曝光令人发指!这可是个活生生的人啊!近日湖南娄底,发生了一件让人特别气愤的事。一女子撞到人以后一路拖行一公里,被拦下后却非常淡定。交警气得拽着她去看,很多路人也被惨状震惊了,真是太过分农村酒席怎么没有人情味儿了?到底是人变了,还是大家观念变了?农村酒席怎么没有人情味儿了?到底是人变了,还是大家观念变了?不知道大家小的时候都生活在哪,反正小编小的时候就生活在农村,然后经常能跟着家里人去参加农村的婚宴呐,或者是白事。那个时候段子播报半截西装劈叉主持,央视主持人原来这么不正经不知道在你的印象当中央视主持人是个什么样的形象,是不是都是专业严肃端庄和不苟言笑。但是在不少主持人私下视频曝光出来后,人们才发现原来平日里正经严肃的主持人们,私下的时候竟然如此不正
能打85折的苹果官翻机买之前一定要注意这三点如果你最近有寻找过手机优惠,相信一定看到过官翻机这个词。在淘宝抖音等电商平台上搜索官翻机,也能够搜索到众多结果,其中不乏一些超低价产品。那么官翻机值得买吗?购买官翻机又有哪些需要注媒体人宁波男篮已签约CBA旧将中锋马尔科托多罗维奇直播吧10月6日讯今日,据媒体人所罗门的臣仆报道,宁波男篮已经签下上赛季效力于北控男篮的黑山籍中锋马尔科托多罗维奇。托多罗维奇(MarkoTodorovic),1992年4月出生,CBA季前赛杰克逊5记三分揽21分法尔47新疆4人得分上双力擒北京北京时间10月7日15时30分,202223赛季CBA季前赛第二比赛日,北京队对阵新疆队。历经一番角逐,新疆队7465战胜北京队。数据统计新疆队杰克逊21分5助攻3抢断,法尔4分7两战轰73分15篮板7封盖!加强版詹姆斯诞生了头条创作挑战赛北京时间10月7号,备受关注的NBA季前赛仍在火热进行中,联赛各队都在积极备战着,力争帮助球队能利用这几场热身赛完成阵容的磨合,以在新赛季拿到更多场次的胜利,吸引了不CBA10月7日辽宁对山东,杨鸣用青年军难求一胜,王晗没琼斯不会玩10月7日晚19点30,首先失利的辽宁男篮将迎战CBA季前赛第二个对手山东男篮,第一场失利对于杨鸣来说不算什么,杨鸣敢在第四节用五名年轻队员在场就是不怕输,把握不住机会输球对杨鸣来苹果手机,死磕SIM卡从iPhone诞生开始,苹果公司就开始对于SIM卡的改造,并一直延续至今。2010年,苹果在iPhone4机型上,首次应用了MicroSIM卡,将SIM卡的面积进行了很大程度上的缩SK追平久哲成第二位五冠教练,赛后深情发文,跟粉丝互怼引争议前言挑战者杯总决赛落下帷幕,武汉eStarPro力克强敌北京WB,卫冕成功的同时也拿到了队史第七冠,这也是他们一年之内拿到的第四个总冠军,可喜可贺。这场比赛eStar三军用命,虽然降低你的视觉疲劳感,2K档真护眼手机推荐现在总有一些手机厂商会去宣传自己的手机产品有什么护眼技术,但实际上仔细考究过后会发现他们的产品采用的并不是护眼性能更好的LCD屏幕,如果你非常在意手机的护眼效果,那么我还是更推荐你抄底时期已经来临!深圳政策不断放出1抄底抄底!抄底正当时!!近22年来房贷利率最低!比如贷款1000万30年可以省31。8万,降息就是降成本,国家在帮我们省成本,业内大佬和权威专家都一致认为,当前是最后的底部抄底时CBA3大消息广东队换掌舵人,辽宁连签3人,马尚想打辽宁队头条创作挑战赛CBA新赛季的比赛季前赛今日开打,广东队由于出现了战况,现在俱乐部全体球员一起进行隔离,没办法出征第一轮的比赛!这对于广东队来说很可惜!新赛季广东队不仅在阵容上有很大CBA赛程辽宁本钢VS山东高速,新闻排名积分榜GBSPORTS虽然刘志轩高诗妍等人离队,但辽宁男篮的主力格局并没有改变,这意味着下赛季夺冠大热门仍将是辽宁队。今年夏天,辽篮同时引进了五名球员,分别是张晨曦米爱丽张俊昊张立文和桑