• 元对象特性测试实例


    1目标

    在这里插入图片描述

    2步骤

    1)创建类Person,成员变量,构造函数,自定义信号
    在这里插入图片描述
    2)实现person的一些函数
    在这里插入图片描述

    3)在widget中添加person类型的成员变量
    在这里插入图片描述

    4)初始化,连接信号和槽
    在这里插入图片描述

    5)槽函数1
    在这里插入图片描述
    6)槽函数2 自定义的槽函数,需要通过connect连接信号ageChanged和槽函数on_ageChanged
    在这里插入图片描述

    7)槽函数3 输出元对象信息,包括属性键值对和QClassInfo键值对
    在这里插入图片描述

    3细节代码

    源代码链接:https://download.csdn.net/download/weixin_44500344/86543158
    1)qperson.h文件

    #ifndef QPERSON_H
    #define QPERSON_H
    
    #include 
    
    class QPerson : public QObject
    {
        Q_OBJECT
        Q_CLASSINFO("author","cuiqianqian")
        Q_CLASSINFO("company","university")
        Q_PROPERTY(unsigned age READ age WRITE setAge NOTIFY ageChanged)
        Q_PROPERTY(QString name MEMBER m_name)
        Q_PROPERTY(int score MEMBER m_score)
    
    private:
        unsigned m_age;
        QString m_name;
        int m_score;
    
    public:
        explicit QPerson(QString name,unsigned age,int score,QObject *parent = nullptr);
        unsigned age();
        void setAge(unsigned value);
        void incAge();
    
    signals:
        void ageChanged(unsigned value);
    
    public slots:
    
    };
    
    #endif // QPERSON_H
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    2)qperson.cpp文件

    #include "qperson.h"
    
    QPerson::QPerson(QString name,unsigned age,int score,QObject *parent) : QObject(parent)
    {
        m_name=name;
        m_age=age;
        m_score=score;
    }
    
    unsigned QPerson::age()
    {
        return m_age;
    }
    
    void QPerson::setAge(unsigned value)
    {
        m_age=value;
        emit(ageChanged(m_age));
    }
    
    
    void QPerson::incAge()
    {
        m_age++;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    3)widget.h文件

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include 
    #include 
    #include 
    #include 
    #include "qperson.h"
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = nullptr);
        ~Widget();
    
    private slots:
        void on_clearButton_clicked();
    
        void on_boyButton_clicked();
    
        void on_girlButton_clicked();
    
        void on_boyBox_valueChanged(int arg1);
    
        void on_girlBox_valueChanged(int arg1);
    
        void on_classInfoButton_clicked();
    
        //自定义槽函数
        void on_ageChanged();
    
    private:
        Ui::Widget *ui;
        QPerson *boy;
        QPerson *girl;
    };
    
    #endif // WIDGET_H
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    4)widget.cpp文件

    #include "widget.h"
    #include "ui_widget.h"
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
        //初始化
        boy = new QPerson("张三",11,90);
        girl= new QPerson("小红",21,100);
        ui->boyBox->setValue(boy->age());
        ui->girlBox->setValue(girl->age());
    
        //当调用person->setAge(),会发出ageChanged函数,执行on_ageChanged()槽函数,输出成员信息
        connect(boy,&QPerson::ageChanged,this,&Widget::on_ageChanged);
        connect(girl,&QPerson::ageChanged,this,&Widget::on_ageChanged);
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    void Widget::on_clearButton_clicked()
    {
        ui->plainTextEdit->clear();
    }
    //男孩长一岁
    void Widget::on_boyButton_clicked()
    {
        boy->incAge();
        ui->boyBox->setValue(boy->age());
    }
    //女孩长一岁
    void Widget::on_girlButton_clicked()
    {
        girl->incAge();
        ui->girlBox->setValue(girl->age());
    }
    
    void Widget::on_boyBox_valueChanged(int arg1)
    {
        boy->setAge(arg1);
    }
    void Widget::on_girlBox_valueChanged(int arg1)
    {
        girl->setAge(arg1);
    }
    
    //自定义的槽函数
    void Widget::on_ageChanged()
    {
        //显示成员信息
        QPerson *aPerson=qobject_cast<QPerson *>(sender());
        QString aName=aPerson->property("name").toString();
        unsigned aAge=aPerson->age();
        int aSorce=aPerson->property("score").toInt();
        ui->plainTextEdit->appendPlainText(aName+
                                           QString::asprintf(",年龄=%d,成绩=%d",aAge,aSorce));
    }
    
    void Widget::on_classInfoButton_clicked()
    {
        const QMetaObject *meta=boy->metaObject();
        ui->plainTextEdit->clear();
        ui->plainTextEdit->appendPlainText("==元对象信息==");
        ui->plainTextEdit->appendPlainText(
                    QString("类命名:%1\n").arg(meta->className()));
        ui->plainTextEdit->appendPlainText("property");
        for(int i=meta->propertyOffset();i<meta->propertyCount();i++){
            QMetaProperty prop=meta->property(i);
            const char *propName=prop.name();
            QString propValue=boy->property(propName).toString();
            ui->plainTextEdit->appendPlainText(
                        QString("属性名称:%1,属性值:%2").arg(propName).arg(propValue));
        }
    
        ui->plainTextEdit->appendPlainText("");
        ui->plainTextEdit->appendPlainText("classInfo");
        for(int i=meta->classInfoOffset();i<meta->classInfoCount();i++){
            QMetaClassInfo classInfo=meta->classInfo(i);
            ui->plainTextEdit->appendPlainText(
                        QString("Name=%1,Value=%2").arg(classInfo.name()).arg(classInfo.value()));
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
  • 相关阅读:
    nextTick 使用场景
    Java面向对象之——多态
    LeetCode2369. Check if There is a Valid Partition For The Array——动态规划
    Kafka开启SASL认证 【windowe详细版】
    翻译: Deep Learning深度学习平台Hugging Face 开源代码和技术构建、训练和部署 ML 模型
    【Java】PAT(Basic Level) Practice(中文) 1015德才论
    深入体验Java Web开发内目-核心基础 PDF篇
    极智开发 | Hello world for Manim
    Nginx: 413 – Request Entity Too Large Error and Solution
    信息检索(五):Query Expansion Using Contextual Clue Sampling with Language Models
  • 原文地址:https://blog.csdn.net/weixin_44500344/article/details/126915149