标题:Qt编写自定义控件41-自定义环形图
作者:liudianwu
日期:2019-08-04 17:44
内容:
一、前言
自定义环形图控件类似于自定义饼状图控件,也是提供一个饼图区域展示占比,其实核心都是根据自动计算到的百分比绘制饼图区域。当前环形图控件模仿的是echart中的环形图控件,提供双层环形图,有一层外圈的环形图,还有一层里边的饼状图,相当于一个控件就可以表示两种类型的占比,这样涵盖的信息量更大,而且提供了鼠标移上去自动突出显示的功能,下面的图例也跟着加粗高亮显示,非常直观,类似的控件在很多web项目中大量运用。
本控件的难点并不是绘制环形或者饼图区域,初学者都会,难点在如何自动精准计算鼠标所在区域,然后高亮突出显示,用的是QPainterPath的contains方法判断当前鼠标在哪个区域,需要在绘制的时候记住该饼图区域的QPainterPath,然后在mouseMoveEvent中判断,需要开启鼠标捕捉。控件原作者雨田哥(https://blog.csdn.net/ly305750665)
二、实现的功能
* 1:可设置是否显示标题+标题文字+标题高度+标题字号
* 2:可设置是否显示图例+图例高度+图例字号
* 3:可设置背景颜色+文字颜色+高亮颜色+标识颜色
* 4:可设置外圆颜色+中间圆颜色+内圆颜色
* 5:可设置外圆数据集合+内圆数据集合
* 6:鼠标悬停突出显示区域并高亮显示文字
* 7:每个区域都可设置对应的颜色+文字描述+百分比
* 8:支持直接字符串设置文字集合和百分比集合
三、效果图

四、头文件代码
#ifndef CUSTOMRING_H
#define CUSTOMRING_H
/**
* 自定义环形图控件 整理:feiyangqingyun(QQ:517216493) 2019-7-28
* 原作者:雨田哥(QQ:3246214072)
* 1:可设置是否显示标题+标题文字+标题高度+标题字号
* 2:可设置是否显示图例+图例高度+图例字号
* 3:可设置背景颜色+文字颜色+高亮颜色+标识颜色
* 4:可设置外圆颜色+中间圆颜色+内圆颜色
* 5:可设置外圆数据集合+内圆数据集合
* 6:鼠标悬停突出显示区域并高亮显示文字
* 7:每个区域都可设置对应的颜色+文字描述+百分比
* 8:支持直接字符串设置文字集合和百分比集合
*/
#include
#ifdef quc
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
#include
#else
#include
#endif
class QDESIGNER_WID ..
#1 [niyouhua 08-05 09:18]
本控件的难点并不是绘制环形或者饼图区域,初学者都会,难点在如何自动精准计算鼠标所在区域,然后高亮突出显示,难点代码没有放出来差评
#2 [xdh873939316 08-08 20:27]
大佬,可以开放一下 mouseMoveEvent 这个函数吗?
#3 回 xdh873939316 的帖子 [佛山无影脚 08-09 15:29]
xdh873939316:大佬,可以开放一下 mouseMoveEvent 这个函数吗? (2019-08-08 20:27)
这里面的代码是诱惑你买代码的部分,给你开放了,他还卖个毛,
#4 [liudianwu 08-09 15:38]
xdh873939316:
大佬,可以开放一下 mouseMoveEvent 这个函数吗?
void CustomRing::mouseMoveEvent(QMouseEvent *event)
{
//通过绘制路径的contains方法判断鼠标是否在对应区域内
bool contains = false;
for (int i = 0; i < inPieInfo.size(); i++) {
if (inPieInfo.at(i).path.contains(event->pos())) {
inPieInfo.offset = 5;
contains = true;
} else {
if (inPieInfo.at(i).offset != 0) {
contains = true;
}
inPieInfo.offset = 0;
}
}
//优先绘制内圆偏移
if (contains) {
for (int i = 0; i < outPieInfo.size(); i++) {
outPieInfo.offset = 0;
}
update();
return;
}
for (int i = 0; i < outPieInfo.size(); i++) {
if (outPieInfo.at(i).path.contains(event->pos())) {
&nbs ..
#5 回 liudianwu 的帖子 [niyouhua 08-09 15:56]
liudianwu:void CustomRing::mouseMoveEvent(QMouseEvent *event)
{
//通过绘制路径的contains方法判断鼠标是否在对应区域内
....... (2019-08-09 15:38)
大佬能不能看下
drawOutPie(&painter, scale, rect.center());
drawInPie(&painter, scale, rect.center());
这二个函数的内容