• QProperty 理解与示例


    QProperty 理解与示例

            该宏用来类中声明属性,跟踪类的数据变化。这些属性的行为类似于类中成员变量,但它们具有可通过元对象系统访问的附加功能。 可以使用通用函数 QObject::property() 和 QObject::setProperty() 来读取和写入属性,除了属性的名称之外,不需要知道有关所属类的任何信息。

            使用QProperty宏和使用信号-槽函数一样,类中必须包含Q_OBJECT宏类,它继承自 QObject,并在其私有部分中使用 Q_OBJECT 宏。在类的私有部分使用 Q_PROPERTY() 宏声明属性。注意声明语句结尾没有分号 

    QObject Class | Qt Core 5.15.10

    官网示例:The Property System | Qt Core 5.15.10 

    1. #pragma once
    2. #include
    3. class QPerson : public QObject
    4. {
    5. Q_OBJECT
    6. Q_CLASSINFO("author", "Yan")
    7. Q_CLASSINFO("company", "GuangDong")
    8. Q_CLASSINFO("Version", "1.0")
    9. Q_PROPERTY(unsigned age READ getAge WRITE setAge NOTIFY ageChanged)
    10. Q_PROPERTY(QString name MEMBER m_name) // 绑定成员变量
    11. Q_PROPERTY(int score MEMBER m_score)
    12. private:
    13. unsigned m_age = 10;
    14. QString m_name;
    15. int m_score = 80;
    16. public:
    17. explicit QPerson(QString name, QObject *parent = nullptr);
    18. inline unsigned getAge()
    19. {
    20. return m_age;
    21. };
    22. void setAge(unsigned value);
    23. void incAge();
    24. signals:
    25. void ageChanged(unsigned value);
    26. };

    两种方式设置属性值:

    1. 通过子类实例对象的 setProperty() 函数

    boy = new QPerson("xiao ming");
    boy->setProperty("age", 12);
    boy->setProperty("sex", "Boy");  // 动态属性
    
    2. 通过父类QObject的setProperty()函数
    QObject *object = boy;// 子类QPerson到父类QObject的转换
    object->setProperty("score", 80);

    ui->SpinBoy->setProperty("isBoy", true);  // UI控件添加动态属性
    ui->SpinGirl->setProperty("isBoy", false);

    connect(boy, &QPerson::ageChanged, this, &Widget::on_ageChanged);  // Sender is Qperson
    connect(girl, &QPerson::ageChanged, this, &Widget::on_ageChanged);

    // 正常两个spinbox值变化,写两个connect链接不同槽函数(利用property做区分可以链接同一个)
    connect(ui->SpinBoy, SIGNAL(valueChanged(int)), this, SLOT(spinBox_valueChanged(int)));   // sender is Spinbox
    connect(ui->SpinGirl, SIGNAL(valueChanged(int)), this, SLOT(spinBox_valueChanged(int)));  

    void Widget::on_ageChanged(unsigned value)
    {
        QPerson *person = qobject_cast(sender());// 槽函数中获取发送者

        QString name = person->property("name").toString();
        unsigned age = person->getAge();
        //    unsigned age = person->property("age").toInt();
        QString sex = person->property("sex").toString();

    //    ui->txtEdit->appendPlainText(name + ", " + sex + ", " + QString::asprintf("age=%d", age)); 

        ui->txtEdit->appendPlainText(name + ", " + sex + ", " + QString("age= %1").arg(age));

        if (sex == "Boy")
        {
            ui->SpinBoy->setValue(age);
        } else
        {
            ui->SpinGirl->setValue(age);
        }
    }

    元对象信息的遍历

    The Property System | Qt Core 5.15.10

    1. void Widget::on_btnClassInfo_clicked()
    2. {
    3. const QMetaObject *meta = boy->metaObject();
    4. ui->txtEdit->clear();
    5. ui->txtEdit->appendPlainText("===Meta object info===\n");
    6. ui->txtEdit->appendPlainText(QString("Class name:%1").arg(meta->className()));
    7. ui->txtEdit->appendPlainText(QString("Property"));
    8. for (int i = meta->propertyOffset(); i < meta->propertyCount(); i++)
    9. {
    10. const char *propName = meta->property(i).name();
    11. ui->txtEdit->appendPlainText(QString("Name=%1, Value=%2").arg(propName).arg(boy->property(propName).toString()));
    12. }
    13. ui->txtEdit->appendPlainText("");
    14. const QMetaObject *metaGirl = girl->metaObject();
    15. for (int i = metaGirl->propertyOffset(); i < metaGirl->propertyCount(); i++)
    16. {
    17. const char *propName = metaGirl->property(i).name();
    18. ui->txtEdit->appendPlainText(QString("Name=%1, Value=%2").arg(propName).arg(girl->property(propName).toString()));
    19. }
    20. ui->txtEdit->appendPlainText("");
    21. ui->txtEdit->appendPlainText("classInfo");
    22. for (int i = meta->classInfoOffset(); i < meta->classInfoCount(); ++i)
    23. {
    24. const QMetaClassInfo classInfo = meta->classInfo(i);
    25. ui->txtEdit->appendPlainText(QString("Name=%1; Value=%2").arg(classInfo.name()).arg(classInfo.value()));
    26. }
    27. }

  • 相关阅读:
    甘特图组件DHTMLX Gantt示例 - 如何有效管理团队工作时间?(二)
    【uniapp】跨域代理及一些常见问题:
    java-php-python-毕业生交流学习平台计算机毕业设计
    c++ unordered_map和map的区别
    C++课程设计《最短路径》
    conan入门(二十八):解决conan 1.60.0下 arch64-linux-gnu交叉编译openssl/3.1.2报错问题
    澳洲2022人口普查结果出炉--华人占比开始下降
    css实现垂直上下布局的两种常用方法
    10道集合框架面试题(含解析),来看看你会多少
    C++ STL(十) --------- 位图模拟实现
  • 原文地址:https://blog.csdn.net/yaked/article/details/126897559