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.rhkb.cn/news/252313.html

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

相关文章

okhttp 的 拦截器

拦截器有很多作用&#xff0c;实现就是责任链模式&#xff0c;细节&#xff0c;等我有时间补上。 后面有时间更新一下。 OkHttp最核心的工作是在 getResponseWithInterceptorChain() 中进行&#xff0c;在进入这个方法分析之前&#xff0c;我们先来了 解什么是责任链模式&…

Gson源码解读

一&#xff0c;概述 gson作为流行的json工具&#xff0c;笔者使用较多。本文主要目的是解读下Gson的源码实现&#xff0c;就没有然后了。 二&#xff0c;实例 实例如下图所示&#xff0c;笔者简单调用gson的toJson方法获得json字符串&#xff0c;fromJson则从json字符串解析…

无人零售模式下,“IoT+鸿蒙”实现零代码搭建自动售货机监控大屏的可能性摸索

前言 新零售模式下&#xff0c;对loT的探索与应用还在继续。 而数字时代&#xff0c;数字化转型在零售行业中蔓延&#xff0c;而对于新的消费方式的探索&#xff0c;也在如火如荼的进行中。于是&#xff0c;一种新零售的形式——无人零售逐渐形成概念。 如果说&#xff0c;人…

PySpark(四)PySpark SQL、Catalyst优化器、Spark SQL的执行流程

目录 PySpark SQL 基础 SparkSession对象 DataFrame入门 DataFrame构建 DataFrame代码风格 DSL SQL SparkSQL Shuffle 分区数目 DataFrame数据写出 Spark UDF Catalyst优化器 Spark SQL的执行流程 PySpark SQL 基础 PySpark SQL与Hive的异同 Hive和Spark 均是:“分…

掌握CSS网格函数fit-content()的妙用

CSS网格布局是一种强大的布局系统&#xff0c;它提供了灵活的网格化设计能力。其中&#xff0c;fit-content()函数是一项重要的功能&#xff0c;它可以帮助我们在网格容器中自动调整网格项的尺寸。本文将详细讲解fit-content()函数的使用方法及其常见应用场景&#xff0c;助你掌…

【笔记】React Native实战练习(仿网易云游戏网页移动端)

/** * 如果系统看一遍RN相关官方文档&#xff0c;可能很快就忘记了。一味看文档也很枯燥无味&#xff0c; * 于是大概看了关键文档后&#xff0c;想着直接开发一个Demo出来&#xff0c;边学边写&#xff0c;对往后工作 * 开发衔接上能够更顺。这期间肯定会遇到各种各样的问题&a…

12. onnx转为rknn测试时有很多重叠框的修改(python)

我们下载rknn-toolkit2-master后并进行前面的处理后&#xff0c;进入到rknn-toolkit2-master\examples\onnx\yolov5文件夹&#xff0c;里面有个test.py文件&#xff0c;打开该文件&#xff0c;其代码如下&#xff1a; # -*- coding: utf-8 -*- # coding:utf-8import os import…

<.Net>使用visual Studio 2022在VB.net中新添自定义画图函数(优化版)

前言 这是基于我之前的一篇博文&#xff1a; 使用visual Studio 2019在VB.net中新添自定义画图函数 在此基础上&#xff0c;我优化了一下&#xff0c;改进了UI&#xff0c;添加了示例功能&#xff0c;即以画圆函数为基础&#xff0c;添加了走马灯功能。 先看一下最终效果&#…

计算机毕业设计 | SSM 医药信息管理系统(附源码)

1&#xff0c; 概述 1.1 课题背景 本系统由说书客面向广大民营药店、县区级医院、个体诊所等群体的药品和客户等信息的管理需求&#xff0c;采用SpringSpringMVCMybatisEasyui架构实现&#xff0c;为单体药店、批发企业、零售连锁企业&#xff0c;提供有针对性的信息数据管理…

react 之 zustand

zustand可以说是redux的平替 官网地址&#xff1a;https://zustand-demo.pmnd.rs/ 1.安装 npm i zustand2.基础使用 // zustand import { create } from zustand// 1. 创建store // 语法容易出错 // 1. 函数参数必须返回一个对象 对象内部编写状态数据和方法 // 2. set是用来…

23、数据结构/查找相关练习20240205

一、请编程实现哈希表的创建存储数组{12,24,234,234,23,234,23},输入key查找的值&#xff0c;实现查找功能。 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> #include<math.h> typedef struct Node {int data;struct n…

re:从0开始的CSS学习之路 2. 选择器超长大合集

0. 写在前面 虽然现在还是不到25的青年人&#xff0c;有时仍会感到恐慌&#xff0c;害怕不定的未来&#xff0c;后悔失去的时间&#xff0c;但细细想来&#xff0c;只有自己才知道&#xff0c;再来一次也不会有太多的改变。 CSS的选择器五花八门&#xff0c;而且以后在JavaScr…

2024年了,如何更好的搭建Kafka集群?

Kafka的Kraft模式简单来说就是基于raft协议重新实现了zookeeper的功能。传统的zookeeper集群已经被标记为弃用&#xff0c;将在kafka4.0中完全移除。由于去掉了zk组件&#xff0c;部署也简化了不少。我们基于Kraft模式和Docker Compose同时采用最新版Kafka v3.6.1来搭建集群。 …

【ARM 嵌入式 编译系列 2.7 -- GCC 编译优化参数详细介绍】

请阅读【嵌入式开发学习必备专栏 】 文章目录 GCC 编译优化概述常用优化等级-O1 打开的优化选项-O2 打开的优化选项-O3 打开的优化选项-Os 打开的优化选项优化技术使用优化选项的注意事项GCC 编译优化概述 GCC(GNU Compiler Collection)包含了用于C、C++、Objective-C、Fort…

ubuntu系统下c++ cmakelist vscode debug(带传参的debug)的详细示例

c和cmake的debug&#xff0c;网上很多都需要配置launch.json&#xff0c;cpp.json啥的&#xff0c;记不住也太复杂了&#xff0c;我这里使用cmake插件带有的设置&#xff0c;各位可以看一看啊✌(不知不觉&#xff0c;竟然了解了vscode中配置文件的生效逻辑&#x1f923;) 克隆…

linux中的mtime,ctime,atime

目录 结论 文件 touch新文件 调整文件内容 echo直接修改 vi修改 修改文件属性 调整归属 调整权限 读取文件 目录 增加文件 调整目录下文件属性 访问目录下文件 删除文件 结论 mtime&#xff1a;文件内容的修改时间&#xff08;不含权限、属组修改&#xff09; …

centos7 在线编译安装 CMake 3.5.1 shell脚本

脚本 要在CentOS 7上在线编译安装CMake 3.5.1&#xff0c;你可以使用以下shell脚本作为参考&#xff1a; #!/bin/bash# 设置下载和安装目录 DOWNLOAD_DIR"/tmp/cmake_download" INSTALL_DIR"/opt/cmake"# 创建目录 mkdir -p $DOWNLOAD_DIR mkdir -p $INS…

浅谈QT的几种线程的使用和区别。

简介&#xff1a; 线程是操作系统中的基本执行单元&#xff0c;是一个独立的执行路径。每个线程都有自己的栈空间&#xff0c;用于存储本地变量和函数调用的上下文。多个线程可以在同一进程中并发执行&#xff0c;从而实现并发处理&#xff0c;提高程序的性能和响应能力。 与进…

【Leetcode】1696. 跳跃游戏 VI

文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 一开始你在下标 0 处。每一步&#xff0c;你最多可以往前跳 k 步&#xff0c;但你不能跳出数组的边界。也就是说&#xff0c;你可以从下标 i 跳到 [i 1&#xff0c; min(n -…

【Unity3D小技巧】Unity3D中UI控制解决方案

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中总是会控制UI界面&#xff0c;如何优雅的控制UI界面是…