QPieSeries QPieSlice label 标签重叠解决方案

2023-10-30

demo 下载地址在最后


通常我们在用QPieSeries 做饼状图,并且饼状图几个部分差别不太大时,label 标签展示都是正常的,期望如下图:

一般情况下做这种饼状图很简单,如:

    QPieSeries *series = new QPieSeries(this);
    series->append("迟到人数22", 22);
    series->append("旷工人数35", 35);
    series->append("正常出勤人数97", 97);
    series->setLabelsVisible();

    QPieSlice *slice1 = series->slices().at(0);
    QPieSlice *slice2 = series->slices().at(1);
    QPieSlice *slice3 = series->slices().at(2);
    slice1->setColor(QColor(79, 129, 189));
    slice2->setColor(QColor(192, 80, 77));
    slice3->setColor(QColor(155, 187, 89));

    QChart *chart = new QChart();
    chart->addSeries(series);
    chart->setTitle("PieChart");
    chart->legend()->hide();

    QChartView *chartview = new QChartView(chart);
    chartview->setRenderHint(QPainter::Antialiasing);
    ui->widget->layout()->addWidget(chartview);

 我们展示了三个标签,数据分别是22, 35 和 97,label 展示的也都正常。但是有一种情况,就是当其中两个数据很小时,会出现标签label 重叠的问题,例如我们将pie的三组数据分别更改为 1, 2 和 97时,就会label就会重叠:

 这显然不是我们想要的。但是怎么样才能避免这种标签重叠的现象呢?其实原理很简单,出现这种情况的原因有两个:

1. 相邻的两个slice 块数值(比例)都很小;

2. 这两个slice 块都在起始角度的一侧;

第二点就是我们要解决这种情况的切入点。 

因为添加  slice 的顺序就是从起始角度开始展示的顺序,例如上面错误的图我们添加的顺序就是小,小,大的顺序,也就是从起始角度(12点钟方向开始顺时针添加),结果就会造成上面的现象。

    QPieSeries *series = new QPieSeries(this);
    series->append("迟到人数1", 1);
    series->append("旷工人数2", 2);
    series->append("正常出勤人数97", 97);

那么我们添加两个最小的 slice 分别显示在起始角度的两侧,那么添加顺序就应该是 小、大、小了,也就是优化一下添加顺序, 就能得出让我们满意的结果。

    series->append("迟到人数1", 1);
    series->append("正常出勤人数97", 97);
    series->append("旷工人数2", 2);

两个新的问题:

1.  局限性:slice的个数不是固定的且每个slice 的大小是会变化的,我们不能写死数据。

2.  每个 slice 颜色是不固定的,最小的永远都是蓝色,最大的永远都是红色...

解决方案:

 我们要解决上面的问题,就要写成一个通用的控件,如果有n个slice,我们就需要对每个slice 按照 数值大小进行排成 : “小-大-小-大...” 的顺序。

如果对每个slice有固定颜色的需求(例如,出勤人数使用绿色,缺勤人数使用红色),我们需要将颜色与slice 进行绑定,没有此需求的可以略过。为做成通用类型,我们slice 绑定固定的颜色。

所以,我们需要将每个slice 信息封装成一个结构体 SliceInfo:

struct SliceInfo{
    int     m_value;        // 数值
    QString m_labelName;    // label 标签
    QColor  m_color;        // 颜色

    SliceInfo(int value, QString name, QColor color) {
        m_value = value;
        m_labelName = name;
        m_color = color;
    }
};

所以,对于n个slice ,我们需要封装一个方法,能够根据 n个SliceInfo 创建排好序的 n个 QPieSlice 对象。然后我们只需要将获取的QPieslice 对象依次添加到 QPieSeries 中即可:

QList<QPieSlice*> MainWindow::sortPie(QList<SliceInfo> &slicesInfo)
{
    // 1. 排序 value "小大小大"  的顺序排列
    QList<SliceInfo> sortSliceInfo;
    bool bMin  = true;
    int count = slicesInfo.size();
    for (int i = 0; i < count; i++) {
        int index = 0;
        for (int j = 1; j < slicesInfo.size(); j++) {
            if (bMin) { // 取最小数
                if (slicesInfo.at(index).m_value > slicesInfo.at(j).m_value) {
                    index = j;
                }
            } else { // 取最大数
                if (slicesInfo.at(index).m_value < slicesInfo.at(j).m_value) {
                    index = j;
                }
            }
        }

        SliceInfo info = slicesInfo.takeAt(index);
        sortSliceInfo.append(info);

        // 交替取大小数
        bMin = !bMin;
    }

    // 2. 创建
    QList<QPieSlice*> slices;
    for (int i = 0; i < sortSliceInfo.size(); i++) {
        QPieSlice *pieSlice = new QPieSlice(sortSliceInfo.at(i).m_labelName, sortSliceInfo.at(i).m_value);
        pieSlice->setColor(sortSliceInfo.at(i).m_color);
        slices.append(pieSlice);
    }

    return slices;
}

这样,我们就可以在获取信息后进行创建一系列排好序的slice了

    QList<SliceInfo> piesInfo;
    piesInfo.append(SliceInfo(1, "迟到人数1", QColor(79, 129, 189)));
    piesInfo.append(SliceInfo(2, "旷工人数2", QColor(192, 80, 77)));
    piesInfo.append(SliceInfo(97, "正常出勤人数97", QColor(155, 187, 89)));

    // 排序
    QList<QPieSlice*> pies = sortPie(piesInfo);

    QPieSeries *series = new QPieSeries(this);
    for (int i = 0; i < pies.size(); i++) {
        series->append(pies.at(i));
    }

 这样我们就用一个通用的方法来解决了QPieSeries QPieSlice label 标签重叠的问题。

demo 免费下载地址 :QT_QPieSeries_QPieSlicelabel标签重叠解决方案-QT文档类资源-CSDN下载QtQPieSeriesQPieSlicelabel标签重叠解决方案详细介绍请参见博客:更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/xiezhongyuan07/85227152

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QPieSeries QPieSlice label 标签重叠解决方案 的相关文章

  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • Qt - 获取互联网上托管的网页的源代码(HTML 代码)

    我想获取网页的源代码 HTML 例如StackOverflow的主页 这是我到目前为止编写的代码 QNetworkAccessManager manager QNetworkReply response manager get QNetwo
  • 如何为 Windows 构建静态 Qt 库并将其与 Qt Creator 一起使用

    我已经下载了以下 Qt 源 http download qt nokia com qt source qt everywhere opensource src 4 7 3 zip http download qt nokia com qt
  • 静态变量中的 qt tr()

    我在 qt 中的翻译方面遇到问题 我的项目中的所有翻译都工作正常 但有一个翻译位于类的静态变量中 相应部分代码如下 头文件类似于这样 typedef struct int type QString problematicString inf
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 将 QByteArray 从大端转换为小端

    我想我在这里有点不知所措 我尝试了这么简单的事情 我不敢相信没有任何内置的 Qt 使用 Qt 5 6 2 我尝试将 QByteArray 内的数据从大端转换为小端 总是从相同的测试 QByteArray 开始 就像这样 QByteArray
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • Qt Creator 2.8.1 Qt 5.1.1 Qt Designer Linux 显示新窗体

    我是 Qt 的初学者 所以希望这是一个容易回答的问题 我有相当多的 C 经验 这部分不是问题 我的应用程序的目的是进行代码生成 最初是为类制作头文件和实现文件 我非常喜欢 Code Blocks 上的类向导 但我认为我可以做更多的事情 我有
  • 常量类成员、赋值运算符和 QList

    请确认我是否正确并告诉我是否有更好的解决方案 我了解具有常量成员的对象 例如int const width 无法由编译器隐式创建的合成赋值运算符处理 但是 QList 我想 std list 也是如此 需要一个有效的赋值运算符 因此 当我想
  • 当从 html 文件读取 Unicode 内容时,为什么 Unicode 字体在 QTextBrowser 中无法正确显示?

    我正在读一本html文件 该文件基本上包含Unicode案文如下 b akko sati kru akkh ti khy abbahati b h b But the QText浏览器不解释Unicode字体 所以QText浏览器显示如下
  • QFileInfo::isWritable() 在 Windows 7 上具有完全权限时返回 false

    QFile file filePath QFileInfo fileInfo file file open QIODevice ReadWrite or WriteOnly if fileInfo isWritable Log error
  • core-plot:仍然不明白如何拥有自定义标签和刻度

    我有这个问题很长时间了 但我找不到任何东西可以解决这个问题 我阅读了几个论坛 但无法找到可行的解决方案 我有以下代码 Adjust graph using above data CPXYPlotSpace plotSpace CPXYPlo
  • 扩展 TabViewStyle styleData

    我目前正在尝试找到一种更好的方法来执行此操作 将图标添加到选项卡 现在 我正在放弃 styleData title 以包含图标源 但如果能够扩展 styleData 就更好了 这样我就可以包含其他自定义属性 这是我当前的黑客 Tab tit
  • 包含 Qt 标头的正确方法是什么?

    到目前为止我知道几种方法 includeQt 类 include
  • QObject多重继承

    我正在尝试在 C Qt 类中使用 mix 来提供一大堆具有通用接口的小部件 该接口是以这样的方式定义的 如果它被定义为其他小部件类的基类 那么小部件本身将具有这些信号 class SignalInterface public QObject
  • WPF - 普通 [标签:输入] 控制的最佳实践

    我想知道 这是在 WPF 中获取众所周知的标签输入 或输出 无关紧要 组合的最佳和最快的方法 这是一个简单的任务 只需考虑 对象 ME 的快速输出 名字 克里斯蒂安 年龄 28 心情 好 我知道 我可以使用带有文本块的网格 但说实话 这个
  • QT C++ QRegularExpression 多个匹配

    我想使用正则表达式从 QString html 中提取信息 我明确想使用正则表达式 无解析器解决方案 和类Q正则表达式 http qt project org doc qt 5 0 qtcore qregularexpression htm
  • AbsoluteLayout - 测量标签高度而不将标签放置在 UI 上

    我在 AbsoluteLayout 中手动定位标签 为了正确地做到这一点 我想在将标签放置在用户界面上之前知道标签的高度 我找到了这个解决方案 但并非没有实际放置标签 public double MeasureLabelHeight str
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上
  • 在 QtCreator 中调试时如何查看 qDebug 消息

    我正在从 Eclipse CDT 带有 Qt 集成插件 过渡到 QtCreator 2 0 但仍有一件事困扰着我 QtCreator 当我在 QtCreator 中调试时 我在Application output tab直到我停止正在调试的

随机推荐

  • volatile 关键字-这一篇就够了

    下文笔者将详细介绍volatile这一篇文章 将使你真真的了解到volatile关键字的用法 如下所示 volatile关键字 的功能 我们都知道volatile关键字有两个功能 1 保证变量的内存可见性 2 禁止指令重排序 可见性 例 变
  • 自学软件测试,1个月内如何快速学到可以找工作的程度?

    首先说下写这篇文章的目的 测试猿课堂在招生的过程中 发现有部分学员因为一些自身的情况 想先短时间学一下软件测试的基础知识 达到可以就业的程度就立马找工作 然后边上班边学习 这种情况可以理解 希望能通过这篇文章 帮助更多急于转行 但同时又希望
  • 二十.刷题.12

    题目 打印出所有水仙花数 所谓水仙花数是指一个三位数 其各位数字立方和等于该数本身 例如 153是一个水仙花数 因为153 1的三次方 5的三次方 3的三次方 include
  • 常用大数据框架对比

    最近看到一篇写大数据框架的文章 写的非常好 也根据自己的经验做一些总结吧 大数据框架的选型对刚接触分布式运算的人来说确实有点迷茫 希望这篇文章可以对大家有所帮助 简介 大数据是收集 整理 处理大量大规模数据集 并从中获得见解所需的非传统战略
  • ES相关DSL语句(持续更新)

    索引操作 创建索引 创建索引使用PUT请求 后面跟上索引名称就好了 由于7 x默认type为 doc 所以后面不必跟上type了 在PUT简单请求同时 可以加上JSON请求体 进行复杂创建 创建索引user 可以通过参数setting设置分
  • C语言编写九九乘法表

    文章目录 基于C语言的九九乘法表实现 1 右上三角 2 左下三角 3 左上三角 4 右下三角 基于C语言的九九乘法表实现 1 右上三角 九九乘法表 右上三角 include
  • IDEA2019自动定位文件

    今天帮同时设置一下 idea自动定位文件 突然发现 idea2019的设置和以前不同了 今天就来记录一下 点击设置按钮 勾选住always select opened file就可以了
  • 学习笔记:关于上拉输入、下拉输入、模拟输入、浮空输入、推挽输出、开漏输出、复用输出的区别

    1 上拉输入 上拉就是把电位拉高 比如拉到Vcc 上拉就是将不确定的信号通过一个电阻嵌位在高电平 电阻同时起限流作用 弱强只是上拉电阻的阻值不同 没有什么严格区分 2 下拉输入 就是把电压拉低 拉到GND 与上拉原理相似 3 浮空输入 浮空
  • PCA:利用PCA(四个主成分的贡献率就才达100%)降维提高测试集辛烷值含量预测准确度并《测试集辛烷值含量预测结果对比》—Jason niu...

    load spectra temp randperm size NIR 1 P train NIR temp 1 50 T train octane temp 1 50 P test NIR temp 51 end T test octan
  • 游戏开发unity编辑器扩展知识系列:自定义菜单子项MenuItem

    参考 https blog csdn net leonardo davinci article details 78503601
  • 爬虫逆向实战(18)-某得科技登录(base64、cookie)

    一 数据接口分析 主页地址 某得科技 1 抓包 通过抓包可以发现数据接口是AjaxLogin 2 判断是否有加密参数 请求参数是否加密 查看 载荷 模块可以发现有一个password加密参数和一个 RequestVerificationTo
  • 排序算法浅识

    排序说简单也简单 说复杂某些地方也是有些绕 这里做做笔记 帮助自己记忆和理解常接触的排序算法到底是什么鬼 什么是排序 其实就是排大小啊大佬 排序的稳定性 为何排序的稳定性很重要 在初学排序时会觉得稳定性有这么重要吗 两个一样的元素的顺序有这
  • Android studio将一个项目作为module导入另一个项目

    1 把要导入的项目变为module 把项目build gradle文件下的 apply plugin com android application 改为 apply plugin com android library 同时删除文件中的
  • 信息检索——查询似然模型(例题)

    例题 信息检索导论 修订版 习题12 7 假定某文档集有如下4篇文档组成 为该文档集建立一个查询似然模型 假定采用文档语言模型和文档集语言模型的混合模型 权重均为0 5 采用MLE来估计两个一元模型 计算在查询click shears以及c
  • 阿里云服务器安装宝塔面板完整图文教程

    下面稍微介绍一下如何使用阿里云服务器安装宝塔面板 概述 如果还有不了解宝塔面板怎么使用的小伙伴 可以看下我总结的系列教程 保证从新手变老鸟 宝塔面板精选教程汇总 宝塔面板教程 1 基于云服务器搭建宝塔面板教程最全详解 宝塔面板教程 2 宝塔
  • 数据的相似性

    相异性矩阵 衡量数据对象之间相关的程度 d i j 表示第i个数据与第j个数据之间的距离 计算数据之间的距离 类别属性 我们可以用失配比的方法进行计算 两个数的失配比指它们中值 不相等 的属性个数占总属性个数的比例 如 计算距离时没有必要考
  • STM32 进阶教程 18 – ADC间断模式

    前言 STM32 的ADC拥有连续扫描模式 也有间断模式 间断模式较扫描模式需要更多的触发事件才能完成所有的通道转换操作 在实际工程应用中 可以利用间断模式实现一些特殊应用 关于间断模式 在STM32的数据手册中有如下描述 本节将给大家展示
  • 用xpath取出属性值的文本

    使用 xpath 取出属性值的文本的方法如下 在 xpath 表达式中使用 符号来选择元素的属性 例如 如果要选择元素的 class 属性 可以使用 class 使用文本函数来获取元素的文本值 例如 要获取 class 属性值的文本 可以使
  • 手写数据库连接池

    数据库连接是个耗时操作 对数据库连接的高效管理影响应用程序的性能指标 数据库连接池正是针对这个问题提出来的 数据库连接池负责分配 管理和释放数据库连接 它允许应用程序重复使用一个现有的数据路连接 而不需要每次重新建立一个新的连接 利用数据库
  • QPieSeries QPieSlice label 标签重叠解决方案

    demo 下载地址在最后 通常我们在用QPieSeries 做饼状图 并且饼状图几个部分差别不太大时 label 标签展示都是正常的 期望如下图 一般情况下做这种饼状图很简单 如 QPieSeries series new QPieSeri