Qt C++属性类型提供给 QML调用(二)

概述

在上一篇文章中已经介绍了 QML 中如何调用 C++的基础属性,那么这里来介绍如何调用C++对象类型属性。

QML 调用对象类型属性

在上一次的代码基础上直接修改一下, 再添加一个类定义,如下:

#include <QObject>

class StudentCourse;

class Student : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ getName WRITE setName NOTIFY sigNameChanged)
    Q_PROPERTY(StudentCourse* course READ getCourse WRITE setCourse NOTIFY sigCourseChanged)
public:
    explicit Student(QObject *parent = nullptr);
    ~Student(){}

    void setCourse(StudentCourse* course){
        m_studentCourse = course;
        emit sigCourseChanged();
    }

    StudentCourse * getCourse(){return m_studentCourse;}

    void setName(const QString & name){
        if(name != m_name){
            m_name = name;
            emit sigNameChanged(m_name);
        }
    }
    QString getName() const {return m_name;}
signals:
    void sigNameChanged(QString name);
    void sigCourseChanged();

private:
    QString m_name;
    StudentCourse * m_studentCourse = Q_NULLPTR;
};

class StudentCourse : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString course READ getCourse WRITE setCourse NOTIFY sigCourseChanged)
public:
    explicit StudentCourse(QObject * parent = nullptr):
        QObject(parent){}
    ~StudentCourse(){}

    void setCourse(const QString & course){
        if(course != m_course){
            m_course = course;
            emit sigCourseChanged(m_course);
        }
    }
    QString getCourse() const{
        return m_course;
    }

signals:
    void sigCourseChanged(QString course);
private:
   QString m_course;
};

由于这次是要调用对象型属性,先要将类注册为 QML 可用的类型,在 main 中进行注册:

qmlRegisterType<Student>("Student", 1, 0, "Student");
qmlRegisterType<StudentCourse>("StudentCourse", 1, 0, "StudentCourse");

最后,在 QML 中进行调用,如下:

Window {
    visible: true
    width: 640
    height: 480

//    Label{
//        anchors.centerIn: parent
//        text: student.name

//    }

    Connections{
        target: st
        onSigNameChanged:{
            console.log("student name changed",name)
        }
    }

    Connections{
        target: st.course

        onSigCourseChanged:{
            console.log("course changed:",st.course.course)
        }
    }

    Component.onCompleted: {
        st.name = "xiaoming"
        st.course.course = "yuwen"
    }

    Student{
        id:st
//        name:"xiaoming"
        course: StudentCourse{
//            course:"yuwen"
        }
    }
}

输出消息:

qml: student name changed xiaoming
qml: course changed: yuwen

代码写得很简单,应该都能看得懂,就不再赘述咯。
代码在这里

猜你喜欢

转载自blog.csdn.net/luoyayun361/article/details/80471478
今日推荐