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动态属性 的相关文章

  • 在 4K 屏幕上使用 Matplotlib 和 TKAgg 或 Qt5Agg 后端

    我在 Ubuntu 16 04 上使用 Matplotlib 2 0 和 Python 3 6 来创建数据图 电脑显示器的分辨率为 4k 分辨率为 3840x2160 绘图数字看起来非常小 字体也很小 我已经尝试过TKAgg and Qt5
  • QPainter 性能高帧率

    我试图在 QPainter 中以 60fps 的速度显示视频 在 OpenGLwidget 中 我遇到一个问题 有时绘图花费的时间太长 并且在使用 QPainter 时发生下一个重绘事件 这会生成警告和随机崩溃 有几个问题 是否有一种 Qt
  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 如何从浮点数组创建新的 QImage

    我有一个代表图像的浮点数数组 列在前 我想在 QGraphicsSecene 上将图像显示为 QPixmap 为了做到这一点 我尝试使用 QImage 构造函数 QImage const uchar data int width int h
  • 如何在 QT 中绘制点?

    我正在用 QT 用 C 编写一个应用程序 其中有 n 个点并计算它的凸包 然而 一旦计算出来 我不知道如何绘制点并绘制船体的边界 制作菜单按钮等很简单 但我不确定我是否知道执行此操作的工具 你怎么做到这一点 图形视图 addEllipse
  • 打开和关闭附加窗口 (QML)

    目前我有一个通过以下方式打开的窗口 property variant win Button id testButton MouseArea onClicked var component Qt createComponent test qm
  • Qt 人工鼠标点击无法正常工作

    小玩具应用程序可以在这里找到 http gist github com 517445 http gist github com 517445 我正在尝试将人工鼠标事件发送到小部件 我使用QApplication sendEvent为此 接下
  • 在 Qt 服务器上验证用户身份

    我正在尝试使用 C QtTcpSocket 为个人项目 多人国际象棋游戏 实现身份验证系统 我的朋友建议了一种验证用户的方法 但我想问是否有更简单或更好的方法 来自 Python 背景 做这个项目主要是为了加深对 C 的理解 我将发布我朋友
  • 在 QtCreator 中使用 .pro 和 .pri 正确(树)显示 Qt 项目

    是否可以使用项目包含文件 pri 显示不止一个额外级别 例如如果 pro文件包括 pri文件包含两个 pri files pro pri pri pri 在 QtCreator 项目 中显示具有误导性 pro pri pri pri 它根本
  • 在没有加载器的情况下实例化内联组件

    有没有办法实例化内联Component 即在同一文件中定义 而不使用Loader 我不太关心使用的性能影响Loader因为我要用很多东西污染我的文件Loader包装纸 我发现从 JavaScript 创建动态 QML 对象 http doc
  • 如何在 OS X 上的 Qt 应用程序中设置应用程序图标,足以进行分发?

    跟进这个答案 https stackoverflow com a 20918932 368896 to 这个问题 https stackoverflow com questions 20909341 what is the fastest
  • Qt 为什么使用 QString::number() 而不是 QLocale().toString()?

    我正在开发的应用程序将在许多国家推出 并且需要支持他们的语言 我一直在回顾我的代码并替换以下每个实例 QString number and QString toDouble with QLocale toString and QLocale
  • 完全彻底卸载QT Creator

    问题 如何从 Linux 机器上卸载 QT Creator 我的 Debian Jessie 机器上的安装已损坏 我尝试过重新安装 修复等 但没有成功 建议我完全卸载 获取最新版本并重新安装 问题是我不确定如何执行此操作 每次我尝试时 QT
  • 如何声明一个带有成员函数指针的函数

    我有一个类 其中的成员变量指向库对象 class myClassA private libraryClass libraryObject 该库类发出事件 以字符串为特征 并提供一种机制 允许客户端类指定在发出事件时应调用的成员函数 因此在m
  • Mac OS X 上的 Qt 字体系列和样式

    我有一个基于 Qt PyQt 的 GUI 应用程序 在 Mac OS X 和其他平台 上运行 它允许用户选择字体并具有粗体和斜体选项的复选框 在更新到新的基于 Cocoa 的 Qt 时 用户发现QFontComboBox不再显示不同的字体样
  • PyQt4 QPalette 不工作

    btn QtGui QPushButton Button self palettes btn palette palettes setColor btn backgroundRole QtCore Qt green btn setPalet
  • 如何在 Qt 应用程序中嵌入 Python 解释器?

    有没有一种简单的方法可以将 Python 解释器嵌入到 Qt 应用程序中 如果可能的话 我希望有一个跨平台的解决方案 这就是目的PythonQt http pythonqt sourceforge net 它支持 Windows Linux
  • 是否有 Qt 小部件可以浏览应用程序中小部件的层次结构(类似于 Spy++)?

    我们有一个具有复杂的小部件层次结构的应用程序 我希望能够以与 Spy 类似的方式浏览此层次结构 查看和编辑属性 例如大小 如果有一个小部件可以显示此信息 则它不需要在外部应用程序中运行 那么问题来了 这样的神兽存在吗 您可以使用Gammar
  • Qt中Q_PROPERTY的意义是什么?

    我无法理解 Q PROPERTY 的用法 Q PROPERTY 如何帮助程序具有防御性 它是干什么用的 我看过这个论坛 但确实无法应用 我已经理解了这个例子 但不明白它的用法 这是一个例子 我能从中得到什么 我知道阅读将赋予只读特权 wri
  • 覆盖 QWebView 中的页面回复

    我试图在 Qt 的 QWebView 中拦截页面 表单请求 并在某些情况下使用替代内容进行响应 QNetworkReply ngcBrowser createRequest Operation operation const QNetwor

随机推荐

  • 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