Qt动态属性

2023-11-07

动态属性

  • 在标准C++中,为了保证封装性,我们经常声明一个私有变量,然后声明两个公有函数,即set函数和get函数。
  • 在Qt中我们可以使用宏Q_PROPERTY()宏来实现这些。一个属性可以使用常规函数QObject::property()和QObject::setProperty()进行读写,不用知道属性所在类的任何细节,除了属性的名字。
    Q_PROPERTY()原型:
Q_PROPERTY(type name 
			(READ getFunction [WRITE setFunction] |
			  MEMBER memberName [(READ getFunction | WRITE setFunction)])
             [RESET resetFunction]
             [NOTIFY notifySignal]
             [REVISION int]
             [DESIGNABLE bool]
             [SCRIPTABLE bool]
             [STORED bool]
             [USER bool]
             [CONSTANT]
             [FINAL])

示例:

1.新建桌面应用程序TestProperty,父类QWidget,其他采用默认。
2.右键单击项目添加自定义类MyPropertyClass,父类QObject.
3.mypropertyclass.h文件中Q_OBJECT下方声明属性宏:

mypropertyclass.h

#ifndef MYPROPERTYCLASS_H
#define MYPROPERTYCLASS_H
#include <QObject>

class MyPropertyClass : public QObject{
    Q_OBJECT
    //动态属性
    Q_PROPERTY(QString Salary READ Salary WRITE setSalary NOTIFY SalaryChanged)
public:
    explicit MyPropertyClass(QObject *parent = nullptr);
    QString Salary() const;         //定义动态属性
    void setSalary(QString salary); //定义动态属性
signals:
    void SalaryChanged(QString str);//定义动态属性
public slots:

private:
    QString m_salary;   //薪资
};

#endif // MYPROPERTYCLASS_H

mypropertyclass.cpp

#include "mypropertyclass.h"

MyPropertyClass::MyPropertyClass(QObject *parent) : QObject(parent){

}

QString MyPropertyClass::Salary() const{
    return m_salary;
}

void MyPropertyClass::setSalary(QString salary) {
    m_salary = salary;
    emit SalaryChanged(m_salary);   //发射信号
}

 

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>

namespace Ui {
    class Widget;
}

class Widget : public QWidget{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void salaryChanged(QString str);

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "mypropertyclass.h"
#include <QDebug>

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
    ui->setupUi(this);
    MyPropertyClass *mypC = new MyPropertyClass;
    MyPropertyClass *mypC2 = new MyPropertyClass;
    connect(mypC, SIGNAL(SalaryChanged(QString)), this, SLOT(salaryChanged(QString)));
    mypC->setSalary("20000");
    qDebug()<< "获取当前薪资: " << mypC->Salary();

    //基类指针操作子类动态类型
    QObject *obj = mypC;
    qDebug() << "obj第一次读取动态属性: " << obj->property("Salary").toString();

    //使用基类指针设置动态属性
    obj->setProperty("Salary", "30000");
    qDebug() << "obj第二次读取动态属性: " << obj->property("Salary").toString();

    //属性仅对当前的对象有效
    qDebug() << "mypC2读取动态属性: " << mypC2->Salary();
}

Widget::~Widget(){
    delete ui;
}

void Widget::salaryChanged(QString str){
    qDebug()<<"新的薪资: " << str;
}

 
main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[]){
    QApplication a(argc, argv);
    Widget w;
    w.show();
	
    return a.exec();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt动态属性 的相关文章

  • 如何从 matlab 调用 Qtproject?

    我在 matlab 中有一个函数可以写入一个 file txt 我在 qt 项目中使用它 So 当我使用 unix 获取要运行的 qt 编译可执行文件时 我有一个 Matlab 文件 但出现错误 代码 unix home matt Desk
  • 将 UTC 格式的 QDateTime 转换为本地系统时间

    我从这样的字符串构造 QDateTime QDateTime date QDateTime fromString 2010 10 25T10 28 58 570Z yyyy MM ddTHH mm ss zzzZ 我知道date是 UTC
  • QWidget::showMinimized() 不起作用

    在 Ubuntu 13 04 上 如果使用QWidget showMinimized 为了最小化窗口 我发现通过单击系统任务栏上的应用程序图标恢复它后 调用QWidget showMinimized 无法工作 connect minimum
  • QFileInfo::isWritable() 在 Windows 7 上具有完全权限时返回 false

    QFile file filePath QFileInfo fileInfo file file open QIODevice ReadWrite or WriteOnly if fileInfo isWritable Log error
  • 如何使用 ClangCodeModel 插件在 QtCreator 中设置 C++ 标准?

    抱歉 如果这是一个愚蠢的问题 但我已经尝试了几乎所有的方法 现在正在用头撞墙 问题是 带有 Clang 代码模型插件的 QtCreator 4 8 0 beta for Windows 解析我的项目 为 C 98 而实际上它是 C 17 但
  • 如何从 Qt 应用程序通过 ODBC 连接到 MySQL 数据库?

    我有一个新安装的 MySQL 服务器 它监听 localhost 3306 从 Qt 应用程序连接到它的正确方法是什么 原来我需要将MySQL添加到ODBC数据源 我在遵循这个视频教程后做到了这一点 https youtu be K3GZi
  • 如何在 Qt simple 上解密/加密某些字符串(例如密码)

    这是我得到的 Qt SDK版本4 6 2 视窗XP 问题 我怎样才能简单地加密和简单地加密QString价值 我需要它能够将一些加密的字符串保存到 INI 文件中 并在重新打开应用程序后将字符串加密为正常的密码字符串值 PS 我正在寻找简单
  • QObject多重继承

    我正在尝试在 C Qt 类中使用 mix 来提供一大堆具有通用接口的小部件 该接口是以这样的方式定义的 如果它被定义为其他小部件类的基类 那么小部件本身将具有这些信号 class SignalInterface public QObject
  • QPainterPath::arcTo 上的角度如何解释?

    我正在开发图形编辑器的功能 在其中编辑弧线 当形状是椭圆形时 QPainterPath arcTo 的行为并不像我预期的那样 当它是一个圆圈时 它会按预期工作 下面的两张图片显示了结果 在第一种情况下 我创建了一个圆 然后将其转换为初始起始
  • 如何将flex和bison与Qt项目集成?

    我正在 git 源代码控制下使用 Qt4 制作 GUI 程序 Github页面 https github com vinayak garg dic sim 项目的一小部分需要扫描和解析 所以我想在项目中使用flex和bison 我能想到3种
  • 如何重写(重新实现)QFileSystemModel 中的成员函数

    我已经为此苦苦挣扎了一段时间 Qt s QFileSystemModel由于图标获取算法非常糟糕 在获取数百个文件时速度非常慢 我想完全禁用图标 它们被提取到QFileSystemModel data方法不是虚拟的 QFileSystemM
  • 无法将 [未定义] 分配给 QColor

    我正在使用 Qt 5 11 构建 运行代码 代码中有QML风格如下 Button style delegate Component id enabledButtonStyle ButtonStyle padding top 0 paddin
  • 在 Windows 上以 QML 播放 RTSP 视频

    我正在尝试将 QML 中的 RTSP 流播放到视频标签中 如下所示 Repeater model 8 Video Layout fillWidth true Layout fillHeight true fillMode VideoOutp
  • 如何使用bind将成员函数作为函数指针传递?

    我试图将成员函数作为函数指针传递 这样我就不需要依赖单例或全局函数来处理 Qt 5 中的 Qt 消息 据我所知 我的 std function 是正确的类型 它具有正确的签名 并且绑定应该允许我插入隐式this指针 本质上是将成员函数传递为
  • qvariant 作为 qhash 中的键

    我想创建一个带有 QVariants 键的数据结构 它看起来像这样 QHash
  • 构建qt程序时未定义的符号:找不到qt_version_tag

    我正在学习Qt5 6 我正在使用 Ubuntu 14 4 当我链接我的程序时 出现以下错误 undefined reference to qt version tag 在 CMakeLists txt 中 link libraries Qt
  • 仅当从 Qt 连接时网页返回 HTTP 406 错误

    我有一个测试页面设置http mlecturedownload com test qt php http mlecturedownload com test qt php有以下代码
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • 渲染具有透明度的纹理时,OpenGL 不需要的像素

    我已经为这个问题苦苦挣扎了一段时间了 当我使用 OpenGL 渲染 2D 纹理 在无透明度和部分透明度之间的过渡上具有透明度值 时 我得到了一些烦人的灰色像素 我认为这是像素值插值的产物 关于如何改进这一点有什么想法吗 I m attach
  • 如何改善 Qt5 程序的启动时间?

    我最近切换到 Qt5 我注意到与 Qt4 相比 初始化 QApplication 花费的时间明显更长 大约几分钟 仔细一看 程序似乎把时间花在了这里 Qt5Guid dll QGlobalStatic

随机推荐

  • InnoDB undo log解析(一)

    InnoDB undo log解析 一 2016 11 28 14 38 277人阅读 评论 0 收藏 举报 在InnoDB存储引擎中 undo log用来完成事务的回滚以及MVCC的功能 但是InnoDB本身提供对于undo log的分析
  • CV代码细节总结(一)

    提示 CV代码细节总结一 目录 前言 一 Python skimage PIL openCV读取的默认格式和通道顺序 二 Python PIL Image获取图像像素时 图像的原点及x y的方向 三 np linalg norm 用法 四
  • 怎么把ide改成ahci_无需重装操作系统,IDE模式轻松改成AHCI模式

    之前写过一个帖子 叫 Win10系统无需重装 硬盘IDE轻松改为AHCI模式的方法 虽然这个方法比较实用 但是却只适用于win10操作系统 那对于其它操作系统 例如现在比较流行的win7 win8 1 就不管用了 其实不重新安装操作系统 I
  • [毕业设计]2022-2023年最新最全计算机专业毕设选题推荐汇总

    目录 javaweb信息管理系统或web应用选题 应用开发类 微信小程序开发方向 游戏动画 数字媒体方向 深度学习 机器学习方向 算法研究方向 物联网 嵌入式方向 信息安全 网络安全 大数据分析 大数据预测 Matlab 选题迷茫 选题的重
  • 【windows-ubuntu通过局域网连接共享文件夹以传输文件】

    windows ubuntu局域网共享文件夹 windows创建共享文件夹 ubuntu通过mount cifs局域网挂载以传输文件 文章目录 windows ubuntu局域网共享文件夹 1 Windows创建共享文件夹 2 Window
  • Latex常见符号对照表

    摘要 Latex可以很方便的利用命令来生成各式各样的特殊符号 这里根据官方的文档将这些常见符号列出 以备查用 B 1 希伯来和希腊字母 Hebrew and Greek letters 希伯来语 希腊语 数学表达式中常常用下面的这些符号 分
  • Unity3D-UGUI-带滚动条的滑动文本框

    1 在Canvas新建一个Panel 添加 scroll Rect和mask组件 2 Panel下新建一个Text Vertical Overflow设置成Overflow 然后添加 Content Size Fitter这个Layout
  • 请求“System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”类型的

    我想哭了 公司要求做一个sharepoint管理用户的模块 具体就是要做一个用户登陆的页面 并且管理员用户可以管理这些登陆用户账号 从一点也不懂 到现在慢慢查看资料 慢慢学着做 期间也遇到了不少问题 但是基本上网上都能找到答案 但是在web
  • Kotlin中空安全操作符,异常处理和自定义异常,以及先决条件函数详解

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到教程 一 Kotlin的可空性 null 在java中我们司空见惯的空指针异常NullPointerException 带给了我们很多麻烦 K
  • spring boot 限制初始值大小及参数中文详解

    要加 m 说明是MB 否则就是KB了 Xms 初始值 Xmx 最大值 Xmn 最小值 java Xms10m Xmx80m jar mod jar 时区设置 java jar Duser timezone GMT 08 mod jar 普通
  • linux系统中设置服务开机自启动

    1 背景描述 最近根据工作需要 需要服务实现开机自启动的效果 因为平时只使用过nohup的后台挂起操作 很少接触开机 镜像装机服务自启动的功能 因此 这里简单记录一下 注意 开机自启动和上面的hohup的表现不一样 开机自启动保证了系统重启
  • [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.3.0.RELEASE:repac

    ERROR Failed to execute goal org springframework boot spring boot maven plugin 2 3 0 RELEASE repackage default on projec
  • Cookie伪造

    解题 创建了一个user用户登陆之后发现 抓包看一下 登录 注册完一个账号 sgx密码 sgx 随便注册 第一次登录时发现它会在服务器中存下一个cookie值并且前缀都是351e766803 把后面的md5解密下发现是sgx和limited
  • 掌握vue指令之(7)v-html指令

    7 v html指令 问题 如果要绑定的变量值是一段HTML代码 则使用 绑定 会保持HTML代码的原样 而不经过编译 直接显示在页面上 解决 今后 只要要绑定的变量值是一段HTML代码 则必须用v html指令代替 来绑定 写法 lt 元
  • MySQL详细安装教程

    1 安装 1 双击打开安装程序 正在安装 2 Choosing a Setup Type界面 在此界面选择Custom 手动安装某些软件 随后点击Next 3 Select Products界面 左框内为可选择安装的软件 右框为已选择准备安
  • CVE-2023-28708 原理剖析

    CVE 2023 28708 原理剖析 这应该不是一个严重的漏洞 可能评分只能为低 因为并没有什么卵用 话不多说 直接进入正题 我的复现环境 tomcat 8 5 50 首先我们得简单写一个servlet 当然不写也没事 因为我们的分析到不
  • Ant Design of Vue动态生成菜单项

    有这样一种情况 需要
  • 1. 嵌入式OpenWRT入门基础篇-----OpenWRT源码下载、编译

    之前一直在做关于op系统的项目 现在不从事这一行了 或许以后也不会了 趁现在还有点记忆 因此在此也算记录一下以前的工作吧 因为OpenWRT是一个很完善的系统 本系列博客也是按照整个系统的开发步骤进行的 本人技术水平不精 如有错误之处 还望
  • Kubernetes初始化集群时报错[ERROR Port-10259]: Port 10259 is in use

    错误原因 节点被占用 报错信息 W0823 00 33 45 142456 107567 validation go 28 Cannot validate kube proxy config no validator is availabl
  • Qt动态属性

    动态属性 在标准C 中 为了保证封装性 我们经常声明一个私有变量 然后声明两个公有函数 即set函数和get函数 在Qt中我们可以使用宏Q PROPERTY 宏来实现这些 一个属性可以使用常规函数QObject property 和QObj