Qt-饼图示范

1.效果图

2.代码如下

2.1 .h文件

#ifndef PIECHARTWIDGET_H
#define PIECHARTWIDGET_H

#include <QWidget>
#include <QChartView>
#include <QPieSeries>

#include<QVBoxLayout>
#include<QMessageBox>
#include <QtCharts>

struct PieData
{
    QString type_s;
    qreal value_q;
};


class PieChartWidget : public QWidget
{
    Q_OBJECT

public:
    PieChartWidget(QWidget *parent = nullptr);
    ~PieChartWidget();

    //设置图表标题
    void f_setTitle(const QString& title);
    //设置图表数据
    void f_setSeries(const QMap<QString, int> &data);

    void f_insert_one(const QString& newType,const int& newValue);
    void f_delete_one(const QString& deleteType);


private slots:
    void f_updata_label();

private:
    QChartView *chartView; // 图表视图
    QChart *chart; // 图表
    QPieSeries *series; // 饼图数据系列

    //数据
    // QMap<QString, int> pieData;

};
#endif // PIECHARTWIDGET_H

2.2 .cpp文件

#include "piechartwidget.h"

PieChartWidget::PieChartWidget(QWidget *parent)
    : QWidget(parent)
{

    // 创建饼图数据系列
    series = new QPieSeries();
    // 创建图表并添加饼图数据系列
    chart = new QChart();
    chart->addSeries(series);

    // 创建图例
    chart->legend()->setVisible(true);
    //图例位置
    chart->legend()->setAlignment(Qt::AlignRight);


    // 创建一个QColor对象,表示浅蓝色
    QColor lightBlue = QColor(173, 216, 230); // 使用RGB值表示浅蓝色,RGB值为(173, 216, 230)
    // 创建一个QBrush对象,设置背景颜色为浅蓝色
    QBrush brush(lightBlue);
    // 使用setBrush方法设置图表的背景画刷为浅蓝色
    chart->setBackgroundBrush(brush);


    // 创建图表视图,并设置图表
    chartView = new QChartView(chart, this);
    chartView->setRenderHint(QPainter::Antialiasing);

    // 将图表视图添加到布局中
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(chartView);

    // 连接数据系列的信号到自定义槽函数
    connect(series, &QPieSeries::added, this, &PieChartWidget::f_updata_label);
    connect(series, &QPieSeries::removed, this, &PieChartWidget::f_updata_label);


    // 连接饼图点击事件的信号和槽
    QObject::connect(series, &QPieSeries::clicked, [=](QPieSlice *slice){
        // 添加点击效果动画
        // 迭代所有饼片并将其还原
        if(slice->isExploded()){
            slice->setExploded(false);
            return;
        }
        for (QPieSlice *s : series->slices()) {
            s->setExploded(false);
        }
        slice->setExploded(true);
        slice->setLabelVisible(true);
        slice->setExplodeDistanceFactor(0.2);
    });

}

PieChartWidget::~PieChartWidget()
{



}

void PieChartWidget::f_setTitle(const QString &title)
{

    chart->setTitle(title);
}

void PieChartWidget::f_setSeries(const QMap<QString, int> &data)
{
    // 清空之前的数据系列
    series->clear();

    // 更新 pieData

    // 添加新的图表数据
    for (auto it = data.begin(); it != data.end(); ++it)
    {
        series->append(it.key(), it.value());
    }

}

void PieChartWidget::f_insert_one(const QString &newType, const int &newValue)
{
    // series->append(newType, newValue);
    bool isExist = false;

    // 获取所有的数据项
    QList<QPieSlice *> slices = series->slices();

    for (int i = 0; i < slices.size(); i++) {
        if (slices.at(i)->label().contains(newType)) {  // 如果类别已存在
            isExist = true;
            // slices.at(i)->setValue(newValue);
            // 如果类别已存在,则将原值与新值相加
            int oldValue = slices.at(i)->value();
            slices.at(i)->setValue(oldValue + newValue);

            break;
        }
    }

    if (!isExist) {  // 如果类别不存在,则添加新的数据项
        series->append(newType, newValue);
    }
    f_updata_label();
}

void PieChartWidget::f_delete_one(const QString &deleteType)
{
    // 从饼图系列中删除特定类型的数据
    for (QPieSlice *slice : series->slices()) {
        qDebug()<<slice->label()<<deleteType;
        if (slice->label().contains(deleteType)) {
            qDebug()<<"从饼图系列中删除特定类型的数据";
            series->remove(slice);
            return;
        }
    }

}

//更新百分比
void PieChartWidget::f_updata_label()
{
    for (int i = 0; i < series->count(); ++i) {
        QPieSlice *slice = series->slices().at(i);
        QString currentLabel = slice->label();
        // 如果当前标签已包含百分比信息,则只更新百分比内容
        QRegularExpression regex("\\d+\\.\\d+%");
        if(regex.match(currentLabel).hasMatch()) {
            QStringList labelParts = currentLabel.split(" ");
            int lastSpaceIndex = currentLabel.lastIndexOf(" ");  // 获取最后一个空格的索引
            QString category = currentLabel.mid(0, lastSpaceIndex);  // 提取空格前的部分作为类别
            QString updatedLabel = QString("%1 %2%").arg(category).arg(100 * slice->percentage(), 0, 'f', 1);
            slice->setLabel(updatedLabel);
        } else {  // 否则,在当前标签后面添加百分比信息
            slice->setLabel(QString("%1 %2%").arg(slice->label()).arg(100 * slice->percentage(), 0, 'f', 1));
        }
    }
    //是否显示在图表上
    series->setLabelsVisible(true);
    //箭头指内,注释指外
    // series->setLabelsPosition(QPieSlice::LabelInsideTangential);
}

3. main

#include "piechartwidget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    PieChartWidget w;


    // 创建 QMap 存储数据
    QMap<QString, int> data;
    data.insert("Category A", 30);
    data.insert("Category B", 20);
    data.insert("Category C", 50);

    w.f_setTitle("测试饼图");
    w.f_setSeries(data);

    w.f_insert_one("新数据",20);
    QString delete_s="Category C";
    w.f_delete_one(delete_s);

    w.f_insert_one("新数据",40);
    w.show();
    return a.exec();
}

2.4 .pro文件

QT       += core gui charts

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    piechartwidget.cpp

HEADERS += \
    piechartwidget.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/555607.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FastAPI - uvicorn设置 logger 日志格式

怎么将日志打印到文件 在main.py加入log_config“./uvicorn_config.json” import uvicornif __name__ "__main__":uvicorn.run("app:app", host"0.0.0.0", port8000, log_config"./uvicorn_config.json")uvicorn_config.json {&qu…

“互联网+”创意创业大赛活动方案

大赛历时6个月&#xff0c;总体分两个赛程&#xff1a;一是策划创意阶段。评审的是方案。二是组织实施阶段。通过阶段一立项的项目由公司协助实施&#xff0c;最终评审的是项目落实情况。学生可两个赛程单独参加&#xff0c;也可连续参加。 具体流程及时间安排如下&#xff1a;…

ansible-tower连接git实现简单执行playbook

前提&#xff1a;安装好ansible-tower和git&#xff0c;其中git存放ansible得剧本 其中git中得内容为&#xff1a; --- - name: yjxtesthosts: yinremote_user: rootgather_facts: noroles:- testroles/test/tasks/main.yml #文件内容 --- #- name: Perform Test Task # tas…

单链表-通讯录

目录 单链表实现 通讯录代码实现 初始化 初始化函数 添加 删除 展示 查找 修改 销毁 代码展示 main.c text.c text.h list.c list.h 和前面的通讯录实现差不多这次就是实现一个以单链表为底层的通讯录 单链表实现 数据结构&#xff1a;单链表-CSDN博客 通讯…

OpenHarmony多媒体-video_trimmer

简介 videotrimmer是在OpenHarmony环境下&#xff0c;提供视频剪辑能力的三方库。 效果展示&#xff1a; 安装教程 ohpm install ohos/videotrimmerOpenHarmony ohpm环境配置等更多内容&#xff0c;请参考 如何安装OpenHarmony ohpm包 。 使用说明 目前支持MP4格式。 视频…

docker部署的nginx配置ssl证书https

申请ssl证书&#xff0c;已腾讯的免费证书为例 2.上传证书到linux服务器 2.1 映射ssql目录 首先确保容器命令已映射宿主机目录&#xff0c;不一定是ssl&#xff0c;也可以是其他路径。 2.2 上传文件到指定路径 以我映射的ssl路径为例&#xff0c;我上传到宿主机的 /usr/local…

【GEE实践应用】使用MODIS NDVI数据集绘制研究区域每日NDVI序列曲线

// 设置研究区域 var geometry table;// 选择MODIS NDVI 数据集 var modisNDVI ee.ImageCollection(MODIS/006/MOD13A2).filterBounds(geometry).filterDate(2000-01-01, 2023-12-31);// 计算每天的平均 NDVI var dailyMeanNDVI modisNDVI.map(function(image) {var date e…

(最详细)关于List和Set的区别与应用

关于List与Set的区别 List和Set都继承自Collection接口&#xff1b; List接口的实现类有三个&#xff1a;LinkedList、ArrayList、Vector。Set接口的实现类有两个&#xff1a;HashSet(底层由HashMap实现)、LinkedHashSet。 在List中&#xff0c;List.add()是基于数组的形式来添…

OpenHarmony网络组件-Mars

项目简介 Mars 是一个跨平台的网络组件&#xff0c;包括主要用于网络请求中的长连接&#xff0c;短连接&#xff0c;是基于 socket 层的解决方案&#xff0c;在网络调优方面有更好的可控性&#xff0c;暂不支持HTTP协议。 Mars 极大的方便了开发者的开发效率。 效果演示 编译…

简述Kafka的高可靠性

什么叫可靠性&#xff1f; 大家都知道&#xff0c;系统架构有三高&#xff1a;「高性能、高并发和高可用」&#xff0c;三者的重要性不言而喻。 对于任意系统&#xff0c;想要同时满足三高都是一件非常困难的事情&#xff0c;大型业务系统或者传统中间件都会搭建复杂的架构来…

万字长文带你APK反编译重签名aabapks转换

Android反编译 反编译&#xff08;Decompilation&#xff09;是将已编译的程序&#xff08;比如二进制代码&#xff09;转换回更高级别的编程语言代码的过程。这通常用于理解程序的工作原理&#xff0c;进行软件审计&#xff0c;恢复丢失的源代码&#xff0c;或者进行教学研究…

提升数据质量的三大要素:清洗prompt、数据溯源、数据增强(含Reviewer2和PeerRead)​

前言 我带队的整个大模型项目团队超过40人了&#xff0c;分六个项目组 每个项目组都是全职带兼职&#xff0c;且都会每周确定任务/目标/计划然后各项目组各自做任务拆解&#xff0c;有时同组内任务多时 则2-4人一组 方便并行和讨论&#xff0c;每周文档记录当周工作内容&…

Leetcode 4.18

Leetcode 1.无重复字符的最长子串2.最长回文子串3.整数反转4.字符串转换整数 (atoi)5.正则表达式匹配 1.无重复字符的最长子串 无重复字符的最长子串 滑动窗口&#xff0c;先让右指针右移&#xff0c;如果发现这个子串有元素和右指针当前元素重复。 则&#xff1a; 左指针右移…

HackmyVM-----Boxing靶机

文章目录 正常打靶流程1.获取靶机IP地址2.获取靶机端口服务3.访问网页4.添加域名WindowsLinux 5.访问域名6.nc反弹shell 7.结束 正常打靶流程 1.获取靶机IP地址 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:10:3c:9b, …

Stable Diffusion XL优化终极指南

如何在自己的显卡上获得SDXL的最佳质量和性能&#xff0c;以及如何选择适当的优化方法和工具&#xff0c;这一让GenAI用户倍感困惑的问题&#xff0c;业内一直没有一份清晰而详尽的评测报告可供参考。直到全栈开发者Flix San出手。 在本文中&#xff0c;Flix介绍了相关SDXL优化…

H264标准协议基础3

参考博文 上一篇H264标准协议基础2 1.解码视频帧的poc计算 2.残差4x4 矩阵中的trailingones & numcoeff 2.1查表 trailingones 表达出尾部one(1,-1)系数的个数,按照zigzag扫描出(1,-1)个数,trailingones的最大为3; numcoeff 表达非零值系数的个数,最多为16个…

uniapp开发 如何获取IP地址?

一定要看到最后&#xff01;&#xff01;&#xff01; 一、需求 使用uniapp开发小程序时&#xff0c;需要调取【记录日活动统计】的接口&#xff0c;而这个接口需要传递一个ip给后台&#xff0c; 那么前端如何获取ip呢&#xff1f;下面代码里可以实现 二、代码实现 1.在项…

游戏开发主程进阶之路|主程或高级开发师面试必备之Android和iOS原生APP内嵌CocosCreator引擎

教程地址&#xff1a; 游戏开发主程进阶之路|主程或高级开发师面试必备之Android和iOS原生APP内嵌CocosCreator引擎 Hello大家好&#xff01;&#xff01;相信大家都玩过用过很多类型的APP应用或者游戏APP&#xff1b;现如今很多社交类型的APP或者教育机构的APP会选择通过在应…

demo(四)nacosgateway(2)gatewayspringsercurity

一、思路 1、整体思路 用户通过客户端访问项目时&#xff0c;前端项目会部署在nginx上&#xff0c;加载静态文件时直接从nginx上返回即可。当用户在客户端操作时&#xff0c;需要调用后端的一些服务接口。这些接口会通过Gateway网关&#xff0c;网关进行一定的处理&#xff0…

多线程学习记录

进程是一个个应用程序&#xff0c;线程则可以理解为一个应用进程中的多个功能。有了多线程&#xff0c;便可以让程序同时去做多件事情。 并发:在同一时刻&#xff0c;有多个指令在单个CPU上交替执行 并行:在同一时刻&#xff0c;有多个指令在多个CPU上同时执行 多线程实现 在J…
最新文章