【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 树是按照「索引值」有序排列…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...