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

ops/2024/11/15 0:29:19/

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/ops/31093.html

相关文章

基于SSM SpringBoot vue宾馆网上预订综合业务服务系统

基于SSM SpringBoot vue宾馆网上预订综合业务服务系统 系统功能 首页 图片轮播 宾馆信息 饮食美食 休闲娱乐 新闻资讯 论坛 留言板 登录注册 个人中心 后台管理 登录注册 个人中心 用户管理 客房登记管理 客房调整管理 休闲娱乐管理 类型信息管理 论坛管理 系统管理 新闻资讯…

如何Vue.js 结合 Element UI 进行表单验证

Vue.js 结合 Element UI 进行表单验证是一个常见的做法。Element UI 提供了一套丰富的表单组件&#xff0c;并内置了表单验证功能。以下是一个简单的示例&#xff0c;展示如何使用 Vue 和 Element UI 进行表单验证&#xff1a; 首先&#xff0c;确保你已经安装了 Vue 和 Eleme…

华为机考入门python3--(20)牛客20- 密码验证合格程序

分类&#xff1a;字符串 知识点&#xff1a; 遍历字符串的每个字符 for char in my_str: 可以直接比较字符范围 a < char < z 列表统计元素个数 my_list.count(elem) 寻找子串 my_str.find(sub_str) 题目来自【牛客】 import re import sysdef check_…

在M1芯片安装鸿蒙闪退解决方法

在M1芯片安装鸿蒙闪退解决方法 前言下载鸿蒙系统安装完成后&#xff0c;在M1 Macos14上打开闪退解决办法接下来就是按照提示一步一步安装。 前言 重新安装macos系统后&#xff0c;再次下载鸿蒙开发软件&#xff0c;竟然发现打不开。 下载鸿蒙系统 下载地址&#xff1a;http…

MLP手写数字识别(1)-MNIST数据集下载与可视化(tensorflow)

1.下载与查看MNIST数据集 from keras.datasets import mnist(x_train_image,y_train_label),(x_test_image,y_test_label) mnist.load_data() print("train images:",x_train_image.shape) print("test images:",x_test_image.shape) print("train …

Android 学习 鸿蒙HarmonyOS 4.0 第四章(TS中的条件判断语句)

PS&#xff1a;在有关TS的博客中呢&#xff0c;我想声明一点&#xff0c;如果是零基础没有开发经验的小伙伴&#xff0c;直接学鸿蒙会有些吃力&#xff0c;可以先学一下TS&#xff0c;比较好入手一些&#xff0c;鸿蒙主推的开发语音是ArkTS&#xff0c;是TS的超集&#xff0c;先…

论文笔记(四十五)Attention Is All You Need

Attention Is All You Need 文章概括摘要1. 介绍2. 背景3. 模型架构3.1 编码器和解码器堆栈3.2 Attention3.2.1 按比例点积Attention3.2.2 Multi-Head Attention3.2.3 注意力在模型中的应用 3.3 定位前馈网络3.4 嵌入与 Softmax3.5 位置编码 4 为什么 Self-Attention5. Trainin…

MySQL存储引擎的选择与深度解析:InnoDB vs MyISAM,以及Memory和Archive

引言 MySQL是一个开源的关系型数据库管理系统&#xff0c;它提供了多种存储引擎以适应不同的应用场景和需求。每种存储引擎都有其独特的特点和优势&#xff0c;如InnoDB、MyISAM、Memory和Archive等。本文将深入探讨这些存储引擎的区别&#xff0c;并提供如何选择合适的存储引…