【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是一个宏,用来添加属性
括号里一共有八个值,下面我来细细剖析
- 第一个值为属性的类型,可以是各种类型
- 第二个值为属性的名字
- READ表示读方法,后面紧跟读方法的函数名
- WRITE表示为写方法,后面紧跟写方法的函数名
- NOTIFY表示通知,是一个信号。
- 注意都是空格隔开
当我们把属性设置好之后,就要开始做具体的实现。
首先先将自定义的信号写好

然后将属性的数据类型加上,还有定义上成员函数跟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就行,但是我们一般不会这么搞。
就先讲到这里,要锁门了,哈哈哈,属性的其他玩法,我会在下一篇发,好的,再见!
相关文章:
【qt】动态属性
这里写目录标题 一.属性1.属性的好处2.添加属性3.使用属性 二.只读属性 一.属性 1.属性的好处 说到属性(property),你们会想到什么?我会联想到特点,就是一类对象所特有的,在C中,成员数据就是这…...
Git知识点总结
目录 1、版本控制 1.1什么是版本控制 1.2常见的版本控制工具 1.3版本控制分类 2、集中版本控制 SVN 3、分布式版本控制 Git 2、Git与SVN的主要区别 3、软件下载 安装:无脑下一步即可!安装完毕就可以使用了! 4、启动Git 4.1常用的Li…...
【数据库】数据库指令
一。数据库打开 1.命令行 2.进入mysql mysql -uroot -p密码 3.退出 exit; 二。针对数据库的操作 1.创建数据库(有分号) create database student; 2.使用数据库 use student 3.删除数据库(有分号) drop database…...
设计模式——状态模式(State)
状态模式(State Pattern)是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。状态模式通过把对象的每一个状态都封装到一个单独的类中,并将请求委托给当前状态对象来让状态的变化与行…...
理解打包好的vue项目结构dist包
目录 linux查询dist目录整体解释子目录文件解释CSSFONTSJS linux查询dist目录 roothcss-ecs-7881:/www/java_project/dist# ls -l total 3004 drwxr-xr-x 2 root root 4096 Dec 31 10:15 css -rw-r--r-- 1 root root 4286 Dec 31 10:15 favicon.ico drwxr-xr-x 2 root r…...
24深圳杯C题18页高质量论文+可执行代码+图表
比赛题目的完整版思路可执行代码数据参考论文都会在第一时间更新上传的,大家可以参考我往期的资料,所有的资料数据以及到最后更新的参考论文都是一次付费后续免费的。注意:(建议先下单占坑,因为随着后续我们更新资料数…...
Midjourney Imagine API 申请及使用
Midjourney Imagine API 申请及使用 申请流程 要使用 Midjourney Imagine API,首先可以到 Midjourney Imagine API 页面点击「Acquire」按钮,获取请求所需要的凭证: 如果你尚未登录或注册,会自动跳转到登录页面邀请您来注册和登…...
电子邮箱是什么?怎么申请一个电子邮箱?
电子邮箱是我们沟通的工具,细分为免费版电子邮箱和付费版电子邮箱。怎么申请一个属于自己的电子邮箱?今天小编就分享一下电子邮箱注册教程,手把手教您注册一个电子邮箱。 一、电子邮箱的定义 电子邮箱,简称邮箱,是一…...
C++ 并发编程指南(11)原子操作 | 11.4、通过内存序实现顺序模型
文章目录 一、通过内存序实现顺序模型1、Relaxed Ordering2、Sequencial Consistent Ordering3、Acquire Release Ordering 前言 前文介绍了六种内存顺序,以及三种内存模型,本文通过代码示例讲解六种内存顺序使用方法,并实现相应的内存模型。…...
【数据结构】栈和队列专题
前言 上篇博客我们讨论了栈和队列的有关结构,本篇博客我们继续来讨论有关栈和队列习题 这些题算是经典了 💓 个人主页:小张同学zkf ⏩ 文章专栏:数据结构 若有问题 评论区见📝 🎉欢迎大家点赞👍…...
2024年程序员最应该关注的几件事?
对于程序员而言,技术和行业趋势的演变是持续关注的焦点。以下是几件2024年程序员应该关注的事情: 持续学习新技术:技术领域的快速变化要求程序员不断更新自己的技能集,包括编程语言、框架、工具和最佳实践。 人工智能与机器学习&…...
【初阶数据结构】单链表基础OJ题讲解
前言 📚作者简介:爱编程的小马,正在学习C/C,Linux及MySQL。 📚本文收录与初阶数据结构系列,本专栏主要是针对时间、空间复杂度,顺序表和链表、栈和队列、二叉树以及各类排序算法,持…...
基于Java的俄罗斯方块游戏的设计与实现
关于俄罗斯方块项目源码.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89300281 基于Java的俄罗斯方块游戏的设计与实现 摘 要 俄罗斯方块是一款风靡全球,从一开始到现在都一直经久不衰的电脑、手机、掌上游戏机产品,是一款游戏规则简单…...
Hadoop 3.4.0+HBase2.5.8+ZooKeeper3.8.4+Hive+Sqoop 分布式高可用集群部署安装 大数据系列二
创建服务器,参考 虚拟机创建服务器 节点名字节点IP系统版本master11192.168.50.11centos 8.5slave12192.168.50.12centos 8.5slave13192.168.50.13centos 8.5 1 下载组件 Hadoop:官网地址 Hbase:官网地址 ZooKeeper:官网下载 Hive:官网下载 Sqoop:官网下载 为方便同学…...
umi搭建react项目
UMI 是一个基于 React 的可扩展企业级前端应用框架,提供路由、状态管理、构建和部署等功能,可以帮助开发者快速构建复杂的单页面应用(SPA)和多页面应用(MPA)。它与 React 的关系是,UMI 构建在 R…...
mybatis-plus之数据源切换事务失效问题
为什么存在数据源切换和食物时效问题? 由于业务数据来源不同 需要配置多个数据源来进行数据的查询 编辑等操作 这一切换业务对数据的一致性要求很高那就要保证ACID啦 也就是数据的有效性 要么是成功的 要么是失败的。 数据源切换采用mybatisplus支持 多数据源配置&a…...
vue 百度地图点击marker修改marker图片,其他marker图片不变。
解决思路,就是直接替换对应marker的图片。获取marker对象判断点击的marker替换成新图片,上一个被点击的就替换成老图片。 marker.name tag;marker.id i; //一定要设置id,我这里是设置的循环key值,要唯一性。map.addOverlay(mark…...
【Javaer学习Python】 1、Django安装
安装 Python 和 PyCharm 的方法就略过了,附一个有效激活PyCharm的链接:https://www.quanxiaoha.com/pycharm-pojie/pycharm-pojie-20241.html 1、安装Django # 安装Django pip install Django# 查看当前版本 python -m django --version 5.0.62、创建项…...
SSL协议
SSL 安全传输协议(安全套接层) 也叫TLS ---- 传输层安全协议 SSL的工作原理:SSL协议因为是基于TCP协议工作的,通信双方需要先建立TCP会话。因为SSL协议需要进行安全保证,需要协商安全参数,所以也需要建立…...
什么情况下会造成索引失效?
2.3.4. 索引失效 对索引使用左或者左右模糊匹配 使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx% 这两种方式都会造成索引失效。但是如果前缀是确定的那么就可以使用到索引,例如 name like 许%。 因为索引 B 树是按照「索引值」有序排列…...
Kimera-VIO实战评估:Euroc数据集上的精度分析与性能测试
Kimera-VIO实战评估:Euroc数据集上的精度分析与性能测试 【免费下载链接】Kimera-VIO Visual Inertial Odometry with SLAM capabilities and 3D Mesh generation. 项目地址: https://gitcode.com/gh_mirrors/ki/Kimera-VIO 想要了解开源视觉惯性里程计系统在…...
OpenHarmony FA启动机制全解析:从本地到远程的分布式能力实现
1. 项目概述:从“点击图标”到“界面呈现”的旅程当我们谈论一个应用在OpenHarmony上的启动,尤其是FA(Feature Ability,特性能力)的启动时,很多人脑海里浮现的可能是“用户点击图标,然后应用打开…...
从图灵完备到意图完备:人工智能的本体论跃迁
什么是真正的智能?是能够执行任意计算任务,还是能够在世界中“存在”,感知、欲望、思考和行动?是能够给出所有正确答案,还是能够提出一个有意义的问题?是能够优化任何给定的目标,还是能够为自己…...
技术从业者的简历优化:如何写出让HR眼前一亮的简历
一、精准匹配:用关键词敲开面试大门在HR筛选简历的“黄金30秒”里,关键词匹配度是第一门槛。对于软件测试从业者来说,精准对接岗位JD(职位描述)中的核心关键词,是让简历脱颖而出的第一步。首先,…...
独家披露:Perplexity未公开的政治新闻过滤白名单(含6国政府通报接口绕过逻辑与合规使用边界)
更多请点击: https://kaifayun.com 第一章:Perplexity政治新闻查询的底层机制与合规边界 Perplexity 在处理政治新闻类查询时,并非直接抓取或缓存原始新闻页面,而是依托其混合检索架构——融合实时网络搜索(通过 Bing…...
深入GD32F427的ENET外设:如何为你的LAN8720 PHY芯片选择正确的RMII时钟模式(REF_CLK In vs Out)
深入解析GD32F427与LAN8720的RMII时钟架构设计 在嵌入式以太网开发中,时钟信号的稳定性往往决定着整个通信系统的可靠性。当GD32F427微控制器通过RMII接口与LAN8720 PHY芯片协同工作时,REF_CLK时钟模式的选择不仅影响硬件成本,更直接关系到信…...
5G网络切换实战:当gNB之间没有Xn接口时,N2/NGAP切换如何保证你的游戏不掉线?
5G网络无缝切换实战:无Xn接口场景下的高可靠连接方案 手游玩家小张正沉浸在激烈的团战中,突然屏幕右上角的延迟数字从30ms飙升至500ms——角色瞬间卡顿,等他重新恢复操作时,团队已经团灭。这种场景在5G时代本应成为历史࿰…...
搜索已死?不,它刚刚重生为Agent的“天眼”
前言2026年,AI Agent的能力正以月为单位狂飙突进。写代码、跑审计、做研报……曾经需要人类全程陪跑的任务,如今八成以上已被Agent自主接管。然而,一个看似微不足道的环节,却成了整个智能链条中最脆弱的一环——搜索。你让Agent查…...
COMTool图表插件使用教程:实时数据可视化与曲线绘制完整指南
COMTool图表插件使用教程:实时数据可视化与曲线绘制完整指南 【免费下载链接】COMTool Cross platform communicate assistant(Serial/network/terminal tool)( 跨平台 串口调试助手 网络调试助手 终端工具 linux windows mac Raspberry Pi )…...
Midjourney × CLO 3D无缝协同方案(工业级打版前必读):实现AI草图→虚拟缝合→力学模拟零损转换
更多请点击: https://kaifayun.com 第一章:Midjourney CLO 3D无缝协同方案(工业级打版前必读):实现AI草图→虚拟缝合→力学模拟零损转换 在高精度服装数字样衣开发流程中,Midjourney生成的创意草图常因缺…...


