qt -chart控件设计器可拖拉

qt -chart控件设计器可拖拉

  • 一、演示效果
  • 二、安装过程
  • 三、核心程序
  • 四、程序链接

一、演示效果

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/edcb974f6f954e158d3995d4bc3d3cd0.pn

二、安装过程

在这里插入图片描述

在这里插入图片描述

三、核心程序

#include <QtGui>
#include <QColor>#include <cstdlib>
#include <cassert>
#include <numeric>#include <chartwork/PieChart.h>
#include <chartwork/Design.h>
#include <chartwork/exceptions/OutOfRangeException.h>
#include <chartwork/exceptions/EmptyException.h>
#include <chartwork/exceptions/UnknownItemException.h>namespace chartwork
{
//
// PieChart
//
PieChart::PieChart(QWidget *parent)
:	Chart(parent),m_fontMetrics(m_font),m_showPercentage(true),m_precision(1),m_labels(std::shared_ptr<QStringList>(new QStringList({"A", "B", "C", "D"}))),m_key(m_labels, m_colors)
{setWindowTitle(tr("Pie Chart"));resize(400, 300);setMinimumSize(200, 150);generateRandomValues();m_title.setText("Pie Chart");update();
}const QStringList &PieChart::labels() const
{return *m_labels;
}void PieChart::setLabels(const QStringList &labels)
{*m_labels = labels;m_key.updateSize();generateRandomValues();update();
}bool PieChart::showKey() const
{return m_key.isVisible();
}void PieChart::setShowKey(bool showKey)
{m_key.setVisible(showKey);update();
}double PieChart::keyScale() const
{return m_key.scale();
}void PieChart::setKeyScale(double keyScale)
{m_key.setScale(keyScale);update();
}bool PieChart::showPercentage() const
{return m_showPercentage;
}void PieChart::setShowPercentage(bool showPercentage)
{m_showPercentage = showPercentage;update();
}int PieChart::precision() const
{return m_precision;
}void PieChart::setPrecision(int precision)
{m_precision = std::max(0, precision);update();
}void PieChart::resetValues()
{m_values.clear();m_values.resize(m_labels->size(), 0.0);
}void PieChart::generateRandomValues()
{resetValues();std::srand(0);for (int i = 0; i < m_labels->size(); i++)m_values[i] = std::rand() / (double)RAND_MAX * 100;
}double PieChart::diameter(int remainingWidth, int remainingHeight) const
{return std::max(0.0, std::min((double)remainingWidth, (double)remainingHeight));
}void PieChart::paintEvent(QPaintEvent *)
{if (m_labels->empty())return;if (m_values.size() < (size_t)m_labels->size())return;m_title.setWidth(width());m_title.moveTopLeft(QPoint(0, design::spacing - m_title.rect().height() / 4));int remainingWidth = width() - m_key.rect().width() - 3 * design::spacing;if (!m_key.isVisible())remainingWidth += design::spacing;const int remainingHeight = height() - m_title.rect().height() - 2 * design::spacing;m_diameter = diameter(remainingWidth, remainingHeight);m_chartRect.setSize(QSize(m_diameter, m_diameter));const int outerSpacing = (remainingWidth - m_diameter) / 2;m_chartRect.moveLeft(design::spacing + outerSpacing);m_chartRect.moveTop(design::spacing + m_title.rect().height() + (remainingHeight - m_diameter) / 2);m_key.moveTopRight(QPoint(m_chartRect.left() + m_chartRect.width() + design::spacing + m_key.rect().width(), design::spacing + m_title.rect().height() + (remainingHeight - m_key.rect().height()) / 2));QPainter painter(this);m_background.paint(painter);m_title.paint(painter);paint(painter);m_key.paint(painter);
}void PieChart::paint(QPainter &painter)
{const double sumOfValues = std::accumulate(m_values.begin(),m_values.end(), 0.0, [](double sum, double v){return sum + std::max(0.0, v);});painter.setRenderHint(QPainter::Antialiasing);double currentAngle = 0;for (size_t i = 0; i < m_values.size(); i++){const double angleValue = m_values[i] / sumOfValues * 360 * 16;if (angleValue <= 0.0)continue;const QColor &color = (*m_colors)[i % m_colors->size()];painter.setBrush(color);painter.drawPie(m_chartRect, std::round(-currentAngle + 90 * 16 - angleValue), std::round(angleValue));currentAngle += angleValue;}painter.setRenderHint(QPainter::Antialiasing,false);if (!m_showPercentage)return;currentAngle = 0;for (size_t i = 0; i < m_values.size(); i++){const double angleValue = m_values[i] / sumOfValues * 2.0 * M_PI;if (angleValue <= 0.0)continue;const double midAngle = -currentAngle + M_PI_2 - angleValue / 2.0f;painter.setPen(Qt::SolidLine);painter.setFont(m_font);const QColor &color = (*m_colors)[i % m_colors->size()];if (color.value() < 210)painter.setPen(design::superlightgray);const QString percentageText = QString("%1").arg(m_values[i] / sumOfValues * 100.0, 0, 'f', m_precision) + QString(" %");const QPoint textCenter = m_chartRect.center() + QPoint(m_diameter / 3 * std::cos(midAngle), -m_diameter / 3 * std::sin(midAngle));const double textWidth = m_fontMetrics.width(percentageText) + 24;const double textHeight = m_fontMetrics.height() + 24;painter.drawText(QRect(textCenter.x() - textWidth / 2,textCenter.y() - textHeight / 2,textWidth,textHeight),percentageText, QTextOption(Qt::AlignCenter));painter.setPen(Qt::NoPen);currentAngle += angleValue;}
}void PieChart::setValue(int slice, double value)
{handleValueUpdate();if (m_values.empty())throw exceptions::EmptyException("PieChart", objectName(), "labels");if (slice < 0 || (size_t)slice >= m_values.size())throw exceptions::OutOfRangeException("PieChart", objectName(), "slice", slice, 0, (int)m_values.size() - 1);m_values[slice] = value;
}void PieChart::setValue(const QString &label, double value)
{if (m_values.empty())throw exceptions::EmptyException("PieChart", objectName(), "labels");const int sliceIndex = m_labels->indexOf(label);if (sliceIndex < 0)throw exceptions::UnknownItemException("PieChart", objectName(), "label", label, *m_labels);setValue(sliceIndex, value);
}void PieChart::setAllValues(double value)
{handleValueUpdate();m_values.clear();m_values.resize(m_labels->size(), value);
}double PieChart::value(int slice) const
{if (m_values.empty())throw exceptions::EmptyException("PieChart", objectName(), "labels");if (slice < 0 || (size_t)slice >= m_values.size())throw exceptions::OutOfRangeException("PieChart", objectName(), "slice", slice, 0, (int)m_values.size() - 1);return m_values[slice];
}double PieChart::value(const QString &label) const
{if (m_values.empty())throw exceptions::EmptyException("PieChart", objectName(), "labels");const int sliceIndex = m_labels->indexOf(label);if (sliceIndex < 0)throw exceptions::UnknownItemException("PieChart", objectName(), "label", label, *m_labels);return value(sliceIndex);
}}

四、程序链接

https://download.csdn.net/download/u013083044/88803860

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java程序设计】【C00232】基于Springboot的抗疫物资管理系统(有论文)

基于Springboot的抗疫物资管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的抗疫物资管理系统 用户主要分为管理员和普通用户 管理员&#xff1a; 管理员可以对后台数据进行管理、拥有最高权限、具体权限有…

【LLM KBQA】FlexKBQA:一种结合LLM的KBQA框架

前言 大语言模型&#xff08;LLMs&#xff09;在知识库问答&#xff08;KBQA&#xff09;领域的应用主要集中在包括但不限于以下几个方面&#xff1a; 直接生成答案&#xff1a;一些方法直接利用LLMs生成答案&#xff0c;而不是生成中间的程序&#xff08;如SPARQL查询&#…

算法学习——华为机考题库3(HJ21 - HJ25)

算法学习——华为机考题库3&#xff08;HJ21 - HJ30&#xff09; HJ21 简单密码 描述 现在有一种密码变换算法。 九键手机键盘上的数字与字母的对应&#xff1a; 1–1&#xff0c; abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0&#xff0c;把密码…

Vue3.0(一):Vue的引入-options api-模板语法

Vue的引入方式 CDN方式进行引入 将以下 script标签引入即可 <script src"https://unpkg.com/vue3/dist/vue.global.js"></script><!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><met…

Linux下tar命令详解

tar #归档命令 格式 • Tar -参数 [args]..... 参数&#xff1a; 必选参数&#xff1a; 辅助参数&#xff1a; 额外参数&#xff1a; # 打包时排除某个文件 tar cf 文件名.tar --exclude路径/文件 路径 注&#xff1a;此处的路径前后需要保持保持一致&#xff0c;统一…

使用 IDEA 开发一个简单易用的 SDK

目录 一、什么是 SDK 二、为什么要开发 SDK 三、开发 SDK 的详细步骤 四、导入 SDK 进行测试 附&#xff1a;ConfigurationProperties 注解的介绍及使用 一、什么是 SDK 1. 定义&#xff1a;软件开发工具包 Software Development Kit 2. 用于开发特定软件或应用程序的工…

Javascript | JS如何断点测试(WebStorm)

JavaScript的断点与之前所学到的Java和python在jetbrain系列编辑器中的断点debug不太一样&#xff0c;往常我们在编写python的时候用pycharm的时候是直接断点进入debug的&#xff0c;就像下面这样 只要直接在代码中断点&#xff0c;然后运行debug功能即可 但是在WebStorm中不是…

【Tomcat与网络3】Tomcat的整体架构

目录 1.演进1&#xff1a;将连接和处理服务分开 2演进2&#xff1a;Container的演进 3 再论Tomcat的容器结构 4 Tomcat处理请求的过程 5 请求的处理过程与Pipeline-Valve管道 在前面我们介绍了Servlet的基本原理&#xff0c;本文我们结合Tomcat来分析一下如何设计一个大型…

【tensorflow 版本 keras版本】

#. 安装tensorflow and keras&#xff0c; 总是遇到版本无法匹配的问题。 安装之前先查表 https://master--floydhub-docs.netlify.app/guides/environments/ 1.先确定你的python version 2.再根据下面表&#xff0c;确定安装的tesorflow, keras

如何用gpt快速做好数据分析?

由于技术限制&#xff0c;目前InfinitePaper AI仅支持上传1份文件&#xff0c;且大小不超过10M。但是&#xff0c;在强大的代码解释器面前&#xff0c;这都是小问题。我们只需要将可能用到的文件打包成压缩文件上传即可&#xff0c;之后要求GPT直接解压就能正常完成后续需求。 …

Unity 读取指定目录所占内存大小

public static class TxxTool{#region 读取文件大小private static List<string> DirList new List<string>();public static long GetFileSize(string path){DirList new List<string>();DirList.Add(path);GetAllDirecotries(path);long fileSize 0;for…

【深度学习】基于PyTorch架构神经网络学习总结(基础概念基本网络搭建)

神经网络整体架构 类似于人体的神经元 神经网络工作原来为层次结构&#xff0c;一层一层的变换数据。如上述示例有4层&#xff0c;1层输入层、2层隐藏层、1层输出层神经元&#xff1a;数据的量或矩阵的大小&#xff0c;如上述示例中输入层中有三个神经元代表输入数据有3个特征…

虚幻UE 特效-Niagara特效实战-魔法阵

回顾Niagara特效基础知识&#xff1a;虚幻UE 特效-Niagara特效初识 其他四篇实战&#xff1a;UE 特效-Niagara特效实战-烟雾、喷泉、 虚幻UE 特效-Niagara特效实战-火焰、烛火、 虚幻UE 特效-Niagara特效实战-雨天、 虚幻UE 特效-Niagara特效实战-眩晕。 本篇笔记记录了使用空模…

代码随想录算法训练营29期|day38 任务以及具体安排

第九章 动态规划part01 509. 斐波那契数 //非压缩状态的版本 class Solution {public int fib(int n) {if (n < 1) return n; int[] dp new int[n 1];dp[0] 0;dp[1] 1;for (int index 2; index < n; index){dp[index] dp[index - 1] dp[index - 2];}r…

二叉树(1)

1 树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&a…

【QT】贪吃蛇小游戏 -- 童年回忆

成品展示 项目分析&#xff1a; &#x1f40d;基本元素如下 &#x1f40d;小蛇的设计&#xff0c;初始大小蛇头占一个方块&#xff0c;蛇身占两个方块。 &#x1f40d;关于小蛇的移动&#xff0c;采用蛇头前进方向增加一个方块&#xff0c;蛇尾减掉一个方块的实现方法。 &#…

享元模式~

“享元”我们可以理解为共享元素&#xff0c;比如我们生活中的共享单车&#xff0c;共享充电宝&#xff0c;共享汽车&#xff0c;这样做的目的就是为了提高资源的复用&#xff0c;但对于共享的单车&#xff0c;充电宝等&#xff0c;它的拥有者和创建时间是不相同的&#xff0c;…

案例九:寻找丢失的数据

在生活中我们经常会遇到误将重要的数据文件删除或误格式化U盘,今天小编带大家一块来学习将丢失的数据找回,来,首先我们这节案例要使用一个工具(R-Studio) 接下来我们一块来如何将数据恢复; 由于我们软件是英文,我们首先要将切换为中文的;‍

记一次 Android CPU高使用率排查

文章目录 背景排查高占用的进程adb shelltoptop -b -H -n 1 | grep 29337 (打印各线程 cpu使用详情)kill -3 29337 (生成trace文件)adb pull /data/anr /Users/gerry.liang/Desktop定位问题 补充说明: 背景 测试同学反馈我们的App CPU使用率 90% 居高不下,经过一番艰难的排查后…

Facebook的数字合作愿景:创新与未来发展

随着科技的飞速发展&#xff0c;Facebook一直处于数字创新的前沿&#xff0c;致力于构建开放、智能、社交的数字社交体验。本文将深入探讨Facebook的数字合作愿景&#xff0c;探索其在创新与未来发展方面的雄心壮志。 引言 在当今数字化时代&#xff0c;社交媒体不仅是人们沟通…