qt -chart控件设计器可拖拉

news2024/9/30 5:30:51

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.coloradmin.cn/o/1428758.html

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

相关文章

FANUC机器人示教器的菜单变成了图标,如何改成列表的形式?

FANUC机器人示教器的菜单变成了图标&#xff0c;如何改成列表的形式&#xff1f; 如下图所示&#xff0c;开机后按下MENU菜单键时&#xff0c;发现原来的列表形式变成了菜单图标的形式&#xff0c;同时在按F1-F5键时&#xff0c;提示&#xff1a;HMI模式-键不可用&#xff0c; …

缓存框架jetcache

在实际应用中&#xff0c;并不是单一的使用本地缓存或者redis&#xff0c;更多是组合使用来满足不同的业务场景。 jetcache组件实现了优雅的组合本地缓存和远程缓存。 支持多种缓存类型&#xff1a;本地缓存、分布式缓存、多级缓存。 官网地址&#xff1a;https://github.com…

解决Docker打包Eureka注册中心,其他服务无法注册问题

​前言 本文主要是介绍利用docker打包Eureka注册中心&#xff0c;并且发布镜像到服务器&#xff0c;遇到的一个比较坑的问题。主要是服务镜像部署完毕之后&#xff0c;docker容器都能启动&#xff0c;并且也能访问&#xff0c;但是其他服务就是无法注册到注册中心。排除问题&a…

【Java程序设计】【C00239】基于Springboot的漫画之家管理系统(有论文)

基于Springboot的漫画之家管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的漫画之家系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;在系统首页可以查看首页&a…

云原生业务全流程DevOps配置预研与实践

背景 我在一个二线城市&#xff08;山东济南&#xff09;&#xff0c;相对与北上广深杭这些IT业发达的城市来说&#xff0c;济南IT业对于业内新技术的接受度是有点慢的&#xff0c;国内很多一线大厂早先几年前就开始实践使用的技术&#xff0c;我们这边也是近两年才开始慢慢兴…

wangEditor v4的简单使用

当前文档是 wangEditor v4 版本的。 wangEditor v5 已经正式发布&#xff0c;可参考文档。 v5 发布之后&#xff0c;v4 将不再开发新功能。 介绍 English documentation wangEditor4 —— 轻量级 web 富文本编辑器&#xff0c;配置方便&#xff0c;使用简单。 官网&#…

2023 OpenHarmony 年度运营报告

汇聚 70 家企业 6700名贡献者力量&#xff0c; OpenHarmony 已成为下一代智能终端操作系统根社区&#xff1b; 我们在成长,OpenHarmony 项目群成员单位增至 35 家&#xff1b; 2023 年持续迭代更新 6 个版本及 OpenHarmony4.0 重点特性简介……

Unity异步加载场景

目录 前言 代码分析 字段解析 属性解析 异步加载场景解析 调用接口实现 资源地址 前言 Unity中常见的加载场景就是异步加载场景&#xff0c;此博客对异步加载场景进行详细介绍 简单易懂好用。含有加载进度&#xff0c;加载动画等。&#xff08;文末附工程&#xff09;…

BUUCTF-Real-[Flask]SSTI

目录 漏洞描述 模板注入漏洞如何产生&#xff1f; 漏洞检测 漏洞利用 get flag ​编辑 漏洞描述 Flask框架&#xff08;jinja2&#xff09;服务端模板注入漏洞分析&#xff08;SSTI&#xff09; Flask 是一个 web 框架。也就是说 Flask 为您提供工具、库和技术来允许您构…

基于Springboot的高校心理教育辅导设计与实现(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的高校心理教育辅导设计与实现(有报告)。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;…

IDEA中的Run Dashboard

Run Dashboard是IntelliJ IDEA中的工具【也就是View中的Services】&#xff0c;提供一个可视化界面&#xff0c;用于管理控制应用程序的运行和调试过程。 在Run DashBoard中&#xff0c;可以看到所有的运行配置&#xff0c;以及每个配置的运行状态&#xff08;正在运行&#xf…

人工智能深度学习发展历程-纪年录

前言 为了理解模型之间的改进关系、明确深度学习的发展目标、提高自身对模型的深度理解、贯彻爱与和平的理念。总之&#xff0c;我做了如下表格。 时间 重大突破 模型改进 详细信息 1847 SGD 随机梯度下降 1995 SVM 支持向量机 1982 RNN 循环神经网络&#xff0c;…

巧用windows的move命令结合jenkins让npm构建速度上来

一.背景 jenkins构建vue2的项目&#xff0c;每次都很慢&#xff0c;即便非常顺利都要1分多钟。之前的文章想到的私服的方式&#xff0c;windows下利用verdaccio私服让npm构建速度上来-CSDN博客。其实慢的原因不仅仅是依赖下载的问题。 二.还有哪里慢 1.源代码同步慢 从构建…

云原生 API 网关链路追踪能力重磅上线

云原生API网关介绍 云原生 API 网关是腾讯云基于开源网关推出的一款高性能高可用的云原生 API 网关产品&#xff0c;作为云上流量入口&#xff0c;集成请求分发、API 管理、流量监控、访问限制等功能&#xff0c;是微服务架构和容器架构中的重要组件。 TSE 云原生 API 网关提…

C++并发编程 -2.线程间共享数据

本章就以在C中进行安全的数据共享为主题。避免上述及其他潜在问题的发生的同时&#xff0c;将共享数据的优势发挥到最大。 一. 锁分类和使用 按照用途分为互斥、递归、读写、自旋、条件变量。本章节着重介绍前四种&#xff0c;条件变量后续章节单独介绍。 由于锁无法进行拷贝…

2024数学建模美赛F题思路代码分享

非法的野生动物贸易会对我们的环境产生负面影响&#xff0c;并威胁到全球的生物多样性。据估 计&#xff0c;它每年涉及高达265亿美元&#xff0c;被认为是全球第四大非法交易。[1]你将开发一个由数 据驱动的5年项目&#xff0c;旨在显著减少非法野生动物贸易。你的目标是说服一…

STM32F407移植OpenHarmony笔记8

继上一篇笔记&#xff0c;成功开启了littlefs文件系统&#xff0c;能读写FLASH上的文件了。 今天继续研究网络功能&#xff0c;让控制台的ping命令能工作。 轻量级系统使用的是liteos_m内核lwip协议栈实现网络功能&#xff0c;需要进行配置开启lwip支持。 lwip的移植分为两部分…

20240202在WIN10下使用fast whisper缺少cudnn_ops_infer64_8.dll

20240202在WIN10下使用fast whisper缺少cudnn_ops_infer64_8.dll 2024/2/2 10:48 https://blog.csdn.net/feinifi/article/details/132548556 Could not locate cudnn_ops_infer64_8.dll. Please make sure it is in your library path!解决办法 安装cuDNN c:\faster-whisper-…

Javascript 日期时间函数的使用

✨前言✨ 1.如果代码对您有帮助 欢迎点赞&#x1f44d;收藏⭐哟 后面如有问题可以私信评论哟&#x1f5d2;️ 2.博主后面将持续更新哟&#x1f618;&#x1f389;本章目录&#x1f389; &#x1f43a;1.什么是时间函数?&#x1f992;2.常用的时间函数有哪些?&#x1f436…

指针的学习1

目录 什么是指针&#xff1f; 野指针 造成野指针的原因&#xff1a; 如何避免野指针&#xff1f; 内存和指针 如何理解编址&#xff1f; 指针变量和地址 取地址操作符& 指针变量和解引用操作符 指针变量 如何拆解指针类型&#xff1f; 指针变量的大小 指针变量…