IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Qt动态属性 -> 正文阅读

[C++知识库]Qt动态属性

动态属性

  • 在标准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();
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:30:30  更:2022-03-21 20:35:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:13:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码