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; 管理员可以对后台数据进行管理、拥有最高权限、具体权限有…

Visual Studio 20XX中utf-8中文在控制台显示乱码

文章目录 在 Visual Studio 20xx中&#xff0c;如果源码文件是 UTF8编码&#xff0c;要打印中文到控制台时&#xff0c;控制台会显示乱码&#xff0c;可以进行以下设置。 包含<Windows.h>头文件。在main函数初始调用SetConsoleOutputCP(CP_UTF8)设置控制台输出字符集为UT…

hadoop使用公平调度器

总计写在前面&#xff0c;请使用公平调度器!!! 我根据时间节点来梳理一下发生了什么。 Stage 1&#xff08;默认调度器&#xff09; 大概在几年前&#xff0c;搭建的数仓集群中。数据量不大&#xff0c;做离线一个晚上就能轻松调度完&#xff0c;那时候使用的hadoop自带的调度…

Unity3D开发之鼠标单双击判断

在开发游戏和交互式应用程序时&#xff0c;经常需要对用户的鼠标点击进行准确的响应。其中&#xff0c;单击和双击事件的判断是常见需求之一。本文将介绍如何在Unity中优雅地实现鼠标单双击判断&#xff0c;使代码结构清晰、易读、易维护。 背景 在许多项目中&#xff0c;我们…

【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…

vscode 突然连接不上服务器了

vscode日志 ll192.168.103.5s password:]0;C:\WINDOWS\System32\cmd.exe [17:09:16.886] Got some output, clearing connection timeout [17:09:16.887] Showing password prompt [17:09:19.688] Got password response [17:09:19.688] "install" wrote data to te…

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. 用于开发特定软件或应用程序的工…

Hive collect_set()、collect_list()列转行,并对转换后的行值排序

Hive collect_set()、collect_list()列转行&#xff0c;和concat_ws()使用&#xff0c;并对转换后的行值排序 1、需求描述 对列值分组&#xff0c;并按一定顺序排序&#xff0c;最后多行合并一行&#xff0c;合并值左到右逆序排列。 2、考点&#xff1a; sort_array(e: colu…

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…