【qt】动态属性

这里写目录标题

  • 一.属性
    • 1.属性的好处
    • 2.添加属性
    • 3.使用属性
  • 二.只读属性

一.属性

1.属性的好处

说到属性(property),你们会想到什么?我会联想到特点,就是一类对象所特有的,在C++中,成员数据就是这个类所特有的。

在C++中为了保证数据安全,一般我们会用到封装,就会把成员数据设置成私有的,但是我们为了能够访问和修改成员数据,我们会定义共有接口。
这样我们就只需要去知道函数的接口名字就可以进行访问和修改了。

那么属性的好处是什么?就是咱们可以不用知道具体的函数接口名称,可以直接用统一的方法进行访问和修改。

有利有弊,弊端是麻烦了程序员,但是造福了使用者。

2.添加属性

属性是属于类的,所以首先咱们来为一个类添加一个属性。
对sources文件右键可以添加类
在这里插入图片描述
基类(Base class)一定要选择QObject,这样就可以使用qt的特性
在这里插入图片描述
开始在car.h中添加属性

#ifndef CAR_H
#define CAR_H#include <QObject>class Car : public QObject
{Q_OBJECTQ_PROPERTY(int money READ getMoney WRITE setMoney NOTIFY moneyChanged)public:explicit Car(QObject *parent = nullptr);signals:};#endif // CAR_H

Q_PROPERTY(int money READ getMoney WRITE setMoney NOTIFY moneyChanged)这句就是添加属性,我这里是为汽车添加了一个价格的属性。
Q_PROPERTY是一个宏,用来添加属性
括号里一共有八个值,下面我来细细剖析

  1. 第一个值为属性的类型,可以是各种类型
  2. 第二个值为属性的名字
  3. READ表示读方法,后面紧跟读方法的函数名
  4. WRITE表示为写方法,后面紧跟写方法的函数名
  5. NOTIFY表示通知,是一个信号。
  6. 注意都是空格隔开

当我们把属性设置好之后,就要开始做具体的实现。
首先先将自定义的信号写好
在这里插入图片描述
然后将属性的数据类型加上,还有定义上成员函数跟c++一样

#ifndef CAR_H
#define CAR_H#include <QObject>class Car : public QObject
{Q_OBJECTQ_PROPERTY(int money READ getMoney WRITE setMoney NOTIFY moneyChanged)public:explicit Car(QObject *parent = nullptr);int getMoney()const;//void setMoney(int money);//signals:void moneyChanged(int money);//private:int m_money;//
};#endif // CAR_H

然后在car.cpp中做具体的实现

#include "car.h"Car::Car(QObject *parent) : QObject(parent)
{}int Car::getMoney()const
{return m_money;
}
void Car::setMoney(int money)
{m_money=money;emit moneyChanged(money);//如果价钱改变了,我们就手动发出信号
}

3.使用属性

接下来就该去使用属性了,先来回顾一下以前我们怎么去使用成员函数去访问和修改数据。
在mainwindow.h中新加一个数据成员和写一个槽函数

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <car.h>//头文件QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();public slots:void moneyChanged(int money);//槽函数private:Ui::MainWindow *ui;Car*car;//定义一个指针来new Car
};
#endif // MAINWINDOW_H

在mainwindow.cpp中:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);car=new Car;//开辟空间connect(car,&Car::moneyChanged,this,&MainWindow::moneyChanged);car->setMoney(219999);qDebug()<<car->getMoney();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::moneyChanged(int money){qDebug()<<"价格改动了!现在是:"<<money<<endl;}

运行结果:
这就是咱们以前的通过成员函数访问和修改成员数据,你必须要知道成员方法名。
在这里插入图片描述
现在我们来用属性的方式来进行成员数据的读和写。
在这里插入图片描述
运行效果:
在这里插入图片描述
可以看成,对象的setProperty等同于原来的setMoney,property等同于原来的getMoney.
这样一来我们就不用管成员函数的名字了,只需要知道属性的名字即可

setProperty的第一个参数为属性的名字,只能是字符串,第二个参数的为属性的值,可以是任何类型。
property的参数只需要属性名,toString()是转换成字符串方便打印

二.只读属性

对于属性的读写我们可以自己进行控制下面我们为汽车做一个品牌的属性,只能读,不能写。

首先添加一个属性,READ,WRITE,NOTIFY都是可控的,可以写或者不写。这里不写WRITE,就不能对其进行写操作,也没有传信号。

在这里插入图片描述

将相关的添加完

在这里插入图片描述

在car.cpp中进行实现

在这里插入图片描述

这里我们就应该要想到,只读的话,我们不能进行设置值,因此咱们要对只读的数据进行初始化在构造函数中。
在这里插入图片描述
然后在car.cpp中进行实现
在这里插入图片描述

在mainwindow.cpp中进行使用,可以看成我们只能读到三无品牌,不能对其进行修改成小米SU7。
在这里插入图片描述

当然只写属性也是可以定义的,加上WRITE,不加READ就行,但是我们一般不会这么搞。

就先讲到这里,要锁门了,哈哈哈,属性的其他玩法,我会在下一篇发,好的,再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/11810.shtml

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

相关文章

2.3 Spark运行架构与原理

Spark运行架构由SparkContext、Cluster Manager和Worker构成。在集群模式下&#xff0c;Driver进程初始化SparkContext并向Cluster Manager申请资源&#xff0c;后者根据算法在Worker节点上启动Executor。Executor负责任务执行&#xff0c;反馈状态给Cluster Manager。任务由Ta…

MyBatis-Plus核心功能详解:条件构造器、自定义SQL与Service接口

在Java的Web开发中&#xff0c;MyBatis-Plus作为MyBatis的增强工具&#xff0c;提供了许多实用的功能&#xff0c;极大地简化了数据库操作的开发过程。下面&#xff0c;我们将详细探讨MyBatis-Plus的三大核心功能&#xff1a;条件构造器、自定义SQL以及Service接口。 一、条件…

FBX Python SDK 入门教程

安装 1. 下载 FBX Python SDK 官网地址&#xff0c;根据你的操作系统&#xff0c;下载相应的 FBX SDK 2020.3.4 Python exe 文件。 2. 安装 执行下载的文件 fbx202034_fbxpythonsdk_win.exe&#xff0c;安装完的程序路径我的是 D:\Program Files\Autodesk\FBX\FBX Python SDK\…

构建滴滴业务中台:系统架构设计探索

在当今数字化时代&#xff0c;滴滴作为中国领先的出行平台&#xff0c;承载着数亿用户的出行需求&#xff0c;业务规模庞大且复杂多样。为了更好地支撑业务发展和提升服务质量&#xff0c;滴滴不断探索和构建业务中台&#xff0c;以实现业务的快速响应、灵活运营和持续创新。在…

【vivado】debug相关时钟及其约束关系

一、前言 在xilinx fpga的degug过程中&#xff0c;经常出现由于时钟不对而导致的观测波形失败&#xff0c;要想能够解决这些问题需要了解其debug的组成环境以及之间的数据流。本文主要介绍debug过程中需要的时钟及各时钟之间的关系。 二、debug相关时钟 Vivado 硬件管理器使…

【NodeMCU实时天气时钟温湿度项目 6】解析天气信息JSON数据并显示在 TFT 屏幕上(心知天气版)

今天是第六专题&#xff0c;主要内容是&#xff1a;导入ArduinoJson功能库&#xff0c;借助该库解析从【心知天气】官网返回的JSON数据&#xff0c;并显示在 TFT 屏幕上。 如您需要了解其它专题的内容&#xff0c;请点击下面的链接。 第一专题内容&#xff0c;请参考&a…

Spring MVC 拦截器编程开以及常见问题

写在前面&#xff1a;最近在对一个微服务增减接口拦截器的时候&#xff0c;定义的拦截器未能生效&#xff0c;并且未报任何异常&#xff0c;swagger的ui也无法正常访问。经查明原因&#xff1a;prehandler方法最后返回的布尔值是false&#xff0c;拦截器定义部分是从其他服务拷…

商城小程序系统与C#.net商城小程序系统源码_OctShop

在移动互联网与电商的时代&#xff0c;商城小程序系统已经成为了众多企业和商家开展电商业务的重要工具。OctShop将以商城小程序系统、C#商城小程序系统源码和.net 商城小程序系统为主题&#xff0c;探讨这些系统的特点和优势。 一、商城小程序系统是什么 商城小程序系统是一种…

Python实战开发及案例分析(20)—— 宽度优先

宽度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;是一种遍历图或树的算法。它从根节点开始&#xff0c;探索所有邻近节点&#xff0c;然后再按顺序访问每个邻近节点的邻居&#xff0c;直到所有节点都被访问为止。在图中&#xff0c;为了避免访问同一个节点多次&…

建筑乙级资质延期中的政策变化与应对策略

在建筑乙级资质延期过程中&#xff0c;政策的变化可能会对企业的运营和策略产生重大影响。为了应对这些变化&#xff0c;企业需要密切关注政策动态&#xff0c;灵活调整自身的经营策略。以下是一些可能的政策变化及相应的应对策略&#xff1a; 一、政策变化 资质延期条件调整&a…

福派斯鲜肉狗粮大揭秘,狗狗吃了都说好!

狗粮哪个牌子好&#xff1f;我强烈推荐福派斯鲜肉狗粮&#xff01;在众多狗粮品牌中&#xff0c;福派斯以其高品质、营养均衡以及独特的产品特点&#xff0c;受到了广大宠物主人的一致好评。 (1) 福派斯鲜肉狗粮的配方表透露出其对于原料选择的严谨和用心。高达75%的鲜肉含量&a…

安卓手机APP开发__支持不同的像素深度

安卓手机APP开发__支持不同的像素深度 目录 概述 使用对深度独立的像素 把DP单位转换成像素单位 概述 安卓设备不仅有不同的大小,还有不同的像素深度.一个设备可能在每一英寸上有 160个像素,另一个设备在相同的尺度上有480个像素.如果你不考虑这些不同, 系统可能会缩放你的…

linux不小心将/etc/passwd用户文件清空或删除解决方法

大概思路&#xff1a;进入单用户模式将passwd-引子程序复制为删除的passwd用户文件&#xff0c;关闭selinux 此系统为&#xff1a;centos 7 1.在GRUB引导的时候按e进入编辑模式&#xff0c;linux16那一行的ro 修改为rw rd.break ‘ ’ 2.ctrlx执行 3.进入单用户模式后修改根…

springboot学习整理

视频&#xff1a;基础篇-01_springboot概述_哔哩哔哩_bilibili 介绍 spring boot 是spring提供的一个子项目&#xff0c;用于快速构建spring应用程序 spring构建&#xff1a; 1 导入依赖繁琐 &#xff1b; 2 项目配置繁琐 spring Framework: 核心 spring Boot :快速构建spring…

AI学习指南概率论篇-信息论

AI学习指南概率论篇-信息论 信息论是信息科学中的一个重要分支&#xff0c;主要研究信息的量、质和流通规律等问题。在人工智能领域中&#xff0c;信息论被广泛应用于数据压缩、数据传输和模型优化等方面。本文将从信息论的概述、AI中的使用场景、定义和意义以及相关公式讲解这…

win11右键菜单恢复win10风格

有很多朋友升级到win11系统之后不是特别喜欢右键菜单&#xff0c;因为经常需要多点击一次显示更多选项&#xff0c;很不舒服。大家就想知道如何修改回原来win10的右键菜单&#xff0c;今天给大家介绍Win11右键菜单怎么修改为以前的样子&#xff0c;仅需执行2条明路&#xff0c;…

秒杀系统之设计方向

1 秒杀存在的问题 对于一个日常平稳的业务系统&#xff0c;如果直接开通秒杀功能的话&#xff0c;往往会出现很多问题—— 2 设计方向的思考 秒杀本质是要求一个瞬时高发下的承压系统&#xff0c;这也是其区别于其他业务的核心场景。对日常系统秒杀产生的问题逐一进行拆解分…

PostgreSQL自带的命令行工具24- postgres

PostgreSQL自带的命令行工具24- postgres postgres 命令主要是 PostgreSQL 数据库服务器的主要执行文件。当你启动 PostgreSQL 服务时&#xff0c;实际上就是在后台运行 postgres 程序。这个程序负责处理用户请求、执行 SQL 命令、管理数据库文件等核心数据库管理任务。通常&a…

深入理解tengine的sysguard模块

目录 1. 引言2. 开启sysguard模块2.1 编译2.2 配置3. 源码分析3.1 配置参数分析3.2 模块的初始化3.3 ngx_http_sysguard_handler函数3.4 各项负载指标的获取3.4.1 load系统负载的获取3.4.2 cpu使用率的获取3.4.3 内存使用情况的获取3.3.5 请求平均响应时间的获取1. 引言 Tengin…

深入浅出:ConcurrentLinkedQueue源码分析与实战

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…