概述
在上一篇文章中已经介绍了 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
代码写得很简单,应该都能看得懂,就不再赘述咯。
代码在这里