QT创造一个新的类(柱状图的类),并关联属性和方法

server/2024/9/20 1:25:00/ 标签: qt, 开发语言

1.以在UI上添加柱状图的类为例(Histogram)

#ifndef STUDY_HISTOGRAM_H
#define STUDY_HISTOGRAM_H#include <QVector>
#include <QWidget>// 前向声明
QT_BEGIN_NAMESPACE
class QColor;
class QRect;
class QString;
class QPaintDevice;
QT_END_NAMESPACEclass Study_HistogramItem
{
public:QString m_Name;qreal	m_Value;QColor	m_PillarColor;QRect	m_PillarRect;
};class Study_Histogram : public QWidget
{public:Study_Histogram( QWidget* parent = 0 );//方法void Study_AddItem( QString name, qreal value,QColor pillarColor );void Study_SetMaxValue( quint32 maxValue );	// 设置最大值,以便绘图void Study_Clear();   // 清空所有已添加的Itemvoid Study_Paint( QPaintDevice* pDevice );	// 绘图protected://刷新页面void paintEvent(QPaintEvent *);private:void Study_DrawAxis( QPaintDevice* pDevice, QPainter* pPainter );     // 绘制坐标轴void Study_DrawPillars( QPaintDevice* pDevice, QPainter* pPainter );	// 绘制柱子void Study_DrawText( QPainter *pPainter );		// 绘制文字void Study_DrawScale( QPaintDevice* pDevice, QPainter* pPainter );	// 绘制刻度//类属性enum Study_HistogramOptions{blankWidth		= 64,		// 两个柱子间的空格大小pillarIndent	= 0,		// 首个柱子缩进的大小xAxisOffset		= 16,		// X轴的偏移(相对于左边界)yAxisOffset		= 16,		// Y轴的偏移(相对于下边界)textRectHeight	= 32		// 文字矩形框的高};qreal							m_Study_axValue;QVector<Study_HistogramItem>			m_Study_VecItems;};#endif // STUDY_HISTOGRAM_H

2.饼图的属性:最大值,单个柱形的信息
在饼图类的构造函数中设置默认的信息:清空之前的柱形组数据


Study_Histogram::Study_Histogram(QWidget *parent)
{m_Study_VecItems.clear( );
}

3.饼图的方法(函数):添加柱形,设置最大值,清空信息
添加柱形:

void Study_Histogram::Study_AddItem(QString name, qreal value, QColor pillarColor)
{//先创建一个柱状信息的实例Study_HistogramItem item;item.m_Name			= name;item.m_Value		= value;item.m_PillarColor	= pillarColor;item.m_PillarRect	= QRect( );//将此实例添加到属性QVector中m_Study_VecItems.push_back( item );
}

设置最大值:

void Study_Histogram::Study_SetMaxValue(quint32 maxValue)
{//将参数传入类属性中m_Study_maxValue = maxValue;
}

清空信息:

void Study_Histogram::Study_Clear()
{//把柱状图信息容器清空m_Study_VecItems.clear();
}

4.某些属性的关联数据(单个柱形信息包括:名字,数据,颜色等)

在类的定义.h文件中,定义了结构体Study_HistogramItem
供给属性QVector<Study_HistogramItem>			m_Study_VecItems;

5.paintEvent进行自动刷新

void Study_Histogram::paintEvent(QPaintEvent *)
{Study_Paint(this);
}void Study_Histogram::Study_Paint(QPaintDevice *pDevice)
{QPainter painter( pDevice );    //Study_DrawAxis( pDevice, &painter );// 绘制坐标轴Study_DrawPillars( pDevice, &painter );// 绘制柱子Study_DrawText( &painter );// 绘制文字Study_DrawScale( pDevice, &painter );// 绘制刻度
}

绘制坐标轴/柱子/文字/刻度(pPainter->drawText)


void Study_Histogram::Study_DrawAxis(QPaintDevice *pDevice, QPainter *pPainter)
{//坐标轴pPainter->drawLine( yAxisOffset, 0, yAxisOffset, pDevice->height( ) );pPainter->drawLine( 0, pDevice->height( ) - xAxisOffset,pDevice->width( ), pDevice->height( ) - xAxisOffset );
}void Study_Histogram::Study_DrawPillars(QPaintDevice *pDevice, QPainter *pPainter)
{//柱子if ( m_Study_VecItems.size( ) == 0 ) return;//const quint32 blankWidth = 64;		// 柱子间空格宽quint32 pillarWidth = ( pDevice->width( ) - yAxisOffset - pillarIndent- quint32( m_Study_VecItems.size( ) - 1 ) * blankWidth )/ m_Study_VecItems.size( );		// 柱子的宽// 绘制因子。绘制因子在绘制柱子的时候起着重要作用。// 根据比例公式:// pDevice->width( ) - xAxisOffset         pillarHeight// --------------------------------- = --------------------//              MaxValue                m_VecItem[0].value// 求出pillarHeight的值,但是左边的部分我们可以看作是一个绘制因子heightFact记录下来。// 计算时可以节约时间。qreal heightFact = qreal( pDevice->height( ) - xAxisOffset ) / m_Study_maxValue;for ( int i = 0; i < m_Study_VecItems.size( ); ++i ){quint32 pillarHeight = m_Study_VecItems[i].m_Value * heightFact;int leftUpX = yAxisOffset + pillarIndent + i * ( pillarWidth + blankWidth );int leftUpY = pDevice->height( ) - xAxisOffset - pillarHeight;QRect& rect = m_Study_VecItems[i].m_PillarRect;rect.setRect( leftUpX, leftUpY, pillarWidth, pillarHeight );pPainter->setPen( QPen( m_Study_VecItems[i].m_PillarColor ) );pPainter->setBrush( QBrush( m_Study_VecItems[i].m_PillarColor ) );pPainter->drawRect( rect );}}void Study_Histogram::Study_DrawText(QPainter *pPainter)
{// 已经可以保证m_VecItems.[i].m_Rect.isNull( )为假// 即柱子所在的矩形框是一个有效的矩形框pPainter->setPen( QPen( QColor( 0, 0, 0 ) ) );for ( int i = 0; i < m_Study_VecItems.size( ); ++i ){QRect rect( m_Study_VecItems[i].m_PillarRect.left( ) - blankWidth / 2,m_Study_VecItems[i].m_PillarRect.top( ) - textRectHeight,m_Study_VecItems[i].m_PillarRect.width( ) + blankWidth,textRectHeight );const QString& text = QString( "%1(%2)" ).arg( m_Study_VecItems[i].m_Name ).arg( m_Study_VecItems[i].m_Value );pPainter->drawText( rect, Qt::AlignCenter, text );}
}void Study_Histogram::Study_DrawScale(QPaintDevice *pDevice, QPainter *pPainter)
{// 名词解释 MSWidth = Marked Scale Width,刻度宽// MSHeight = Marked Scale Height 刻度高const quint32 MSWidth			= 100;const quint32 MSHeight			= textRectHeight;const quint32 heightInterval= ( pDevice->height( ) - xAxisOffset ) / 4;for ( int i = 0; i < 4; ++i ){QRect rect( 0,i * heightInterval,MSWidth,MSHeight );pPainter->drawLine( yAxisOffset - 2,i * heightInterval,yAxisOffset + 2,i * heightInterval );pPainter->drawText(rect, Qt::AlignLeft, QString( "%1" ).arg( m_Study_maxValue * ( 4 - i ) / 4 ) );}
}

使用:直接用ui -> …(提升的UI名) -> 类方法,此处ui->widget_histogram已经在UI中提升为Study_Histogram

    ui->widget_histogram->Study_SetMaxValue(100);ui->widget_histogram->Study_AddItem("name1",35,"red");ui->widget_histogram->Study_AddItem("name2",45,"green");ui->widget_histogram->Study_AddItem("name3",55,"black");ui->widget_histogram->Study_AddItem("name4",75,"red");

效果:
在这里插入图片描述


http://www.ppmy.cn/server/31231.html

相关文章

基于.NET WinForms 数据的CURD实现

开发工具 VS 2022 C#&#xff0c;数据库MS SQL SERVER 2019 1.WinForms界面 2.使用SqlDataApater DataSet DataGridView 读取数据 private void ReadData() {//数据库连接串string strConn "Data Source127.0.0.1;Initial CatalogTEST;Persist Security InfoTrue;Us…

python直接发布到网站wordpress之一只发布文字

本地环境&#xff1a;win10&#xff0c;python3.8.10。 远程服务器&#xff1a;是宝塔一键部署的wordpress6.5.2。 本地需要安装&#xff1a;pip38 install python-wordpress-xmlrpc。 本篇记录只发布文字&#xff08;不含图片&#xff09;&#xff0c;直接上代码&#xff1a…

关于Kotlin

Kotlin是一种由JetBrains公司开发的静态类型编程语言&#xff0c;它专为现代多平台应用设计。Kotlin的语法简洁&#xff0c;安全且实用&#xff0c;并且专注于与Java的互操作性。它几乎可以运行在任何Java语言可以运行的地方&#xff0c;但相比Java&#xff0c;Kotlin更加简洁、…

mac 安装anaconda

1. anaconda Anaconda是一个开源的Python和R编程语言的发行版本&#xff0c;用于数据科学、机器学习、大数据处理和科学计算等领域。它包含了一系列用于数据分析和科学计算的软件包、库和工具&#xff0c;以及一个用于管理环境和依赖关系的包管理系统。 Anaconda主要包括以下…

安卓抓包总结

背景 接手公司项目安卓xhs项目&#xff0c;该项目为android数据采集接口&#xff0c;该接口目前只能调用一次&#xff0c;然后就被平台风控&#xff0c;导致无法使用&#xff0c;需要恢复该接口继续使用&#xff0c;所以需要抓包分析调用的接口&#xff0c;对比接口参数和请求都…

Python中备选构造函数,classmethod和staticmethod的用法

在Python官方教程中并没有提及classmethod和staticmethod这两个装饰器。学过java面向对象编程的同学可能会觉得奇怪&#xff0c;为什么Python提供两个这样的装饰器&#xff0c;而不是只提供一个&#xff1f; 我们先来看看classmethod&#xff0c;它的用法&#xff1a;定义操作…

java设计模式 -- 工厂模式

1、基本概念 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 工厂…

数据仓库——聚集

在数据仓库中&#xff0c;聚集&#xff08;Aggregation&#xff09;是一个重要的概念&#xff0c;它涉及到对大量详细数据进行统计和汇总&#xff0c;以便更高效地执行查询和分析。以下是关于数据仓库中聚集的详细解释&#xff1a; 概念&#xff1a;聚集是指按照维度粒度、指标…

Android 编译文件简述(Android.mk)

Android 编译文件简述(Android.mk) Android.mk 文件是 Android 构建系统中的一种构建配置文件,使用 GNU Make 语法,用于定义 Android 项目中的模块、库、应用程序、JNI 代码等的编译和链接方式。每个 Android.mk 文件通常对应一个目录,代表构建系统应该如何处理该目录下的源…

一加12/11/10/Ace2/Ace3手机上锁回锁BL无限重启黑屏9008模式救砖

一加12/11/10/Ace2/Ace3手机官方都支持解锁BL&#xff0c;搞机的用户也比较多&#xff0c;相对于其他品牌来说&#xff0c;并没有做出限制&#xff0c;这也可能是搞机党最后的救命稻草。而厌倦了root搞机的用户&#xff0c;就习惯性回锁BL&#xff0c;希望彻底变回官方原来的样…

中间件之异步通讯组件RabbitMQ进阶

这里我们必须尽可能确保MQ消息的可靠性&#xff0c;即&#xff1a;消息应该至少被消费者处理1次 那么问题来了&#xff1a; 我们该如何确保MQ消息的可靠性&#xff1f; 如果真的发送失败&#xff0c;有没有其它的兜底方案&#xff1f; 首先&#xff0c;我们一起分析一下消息…

C#面:如何部署 ASP.NET 页面

在C#中部署 ASP.NET 页面有几种常见的方式&#xff0c;下面我将介绍其中两种常用的方式&#xff1a; IIS部署&#xff1a; 在服务器上安装IIS&#xff08;Internet Information Services&#xff09;。 在IIS中创建一个新的网站或虚拟目录&#xff0c;将其指向你的ASP.NET项目…

android zygote进程启动流程

一&#xff0c;启动入口 app_main.cpp int main(int argc, char* const argv[]) {if (!LOG_NDEBUG) {String8 argv_String;for (int i 0; i < argc; i) {argv_String.append("\"");argv_String.append(argv[i]);argv_String.append("\" ")…

Python 植物大战僵尸

文章目录 效果图项目结构实现思路源代码 效果图 项目结构 实现思路 下面是代码的实现思路&#xff1a; 导入必要的库和模块&#xff1a;首先&#xff0c;我们导入了Python的os、time库以及pygame库&#xff0c;还有植物大战僵尸游戏中用到的各个植物和僵尸的类。 初始化游戏和…

UNIAPP小程序从入门到精通

第一章> 1、如何创建项目 2、项目的基本结构 3、页面组成&#xff08;wxss可以不用&#xff09; 4、组件的使用 5、协同开发与发布 第二章> 6、WXML页面结构渲染 7、style样式美化 8、a…

富格林:有效控制暗箱阻挠被骗

富格林悉知&#xff0c;当前现货黄金的行情波动较为激烈&#xff0c;对于我们投资者来说意味着投资盈利的机会多了&#xff0c;但同时投资暗箱风险亦随之而来。如果我们面对暗箱风险没有做好半点准备的话&#xff0c;可能会遭遇巨大损失甚至无法阻挠被骗。那么我们该如何阻挠被…

ASV1000视频监控平台:通过SDK接入海康网络摄像机IPC

目录 一、为何要通过SDK接入海康网络摄像机 &#xff08;一&#xff09;海康网络摄像机的SDK的功能 1、视频采集和显示 2、视频存储 3、视频回放 4、报警事件处理 5、PTZ控制 6、自定义设置 7、扩展功能 &#xff08;二&#xff09;通过SDK接入的好处&#xff08;相对…

【ZYNQ】Zynq 开发流程

Zynq 芯片架构由嵌入式处理器&#xff08;Processing System, PS&#xff09;与可编程逻辑&#xff08;Programmable Logic, PL&#xff09;&#xff0c;以及 PS 与 PL 之间的互联总线组成。本文主要介绍 Xilinx Zynq 芯片开发所使用的软件&#xff0c;包括 Vivado IDE 与 Xili…

菜鸡学习netty源码(三)—— Reactor 模型

1.概述 我们先进行理解一下Reactor模型&#xff0c;知道什么是Reactor模型&#xff0c;它有什么特别之处。我们先来简单介绍一下这个Reactor模型。 Reactor模型的核心思想&#xff1a; 就是将所关注的I/O事件进行注册到一个多路复用器上&#xff0c;一旦有I/O事件的发生&#…

如何让 PDF 书签从杂乱无序整洁到明丽清新

1、拉取书签&#xff08;详细步骤看文末扩展阅读&#xff09; 原状态 —— 杂乱无序 自动整理后的状态 —— 错落有致&#xff0c;但摩肩接踵 2、开始整理 全选自动整理后的书签&#xff0c;剪切 访问中英混排排版优化 - 油条工具箱 https://utils.fun/cn-en 1 粘贴 → 2 …