Qt5官方demo解析集22——Extending QML - Object and List Property Types Example

来源:互联网 发布:自动答题软件 编辑:程序博客网 时间:2024/05/17 08:05

本系列所有文章可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873

接上文Qt5官方demo解析集21——Extending QML - Adding Types Example


在上一个例子中我们基于C++创建了一个自定义的QML类型,接下来,我们将该类作为另一个类的属性类型,定义了另一个birthdayparty类。这个例子与Qt5官方demo解析集19——Chapter 5: Using List Property Types是十分相似的,只不过在这个例子中只提供了对列表属性的访问能力。

项目文件如下:



Person的定义和声明与上一篇博文中所贴出的一致,因此我们先看看birthdayparty.h:

#ifndef BIRTHDAYPARTY_H#define BIRTHDAYPARTY_H#include <QObject>#include <QQmlListProperty>                           // 这个类型我们在解析集19中有讨论过,它用来提供带有列表成员的属性#include "person.h"// ![0]class BirthdayParty : public QObject{    Q_OBJECT// ![0]// ![1]    Q_PROPERTY(Person *host READ host WRITE setHost)           // host属性,指向一个Person对象// ![1]// ![2]    Q_PROPERTY(QQmlListProperty<Person> guests READ guests)    // guests属性,指向一个Person列表// ![2]// ![3]public:    BirthdayParty(QObject *parent = 0);    Person *host() const;    void setHost(Person *);    QQmlListProperty<Person> guests();     // 上面是属性的读写函数    int guestCount() const;                // 下面是自定义的用来返回客人数与读取某个客人的函数    Person *guest(int) const;private:    Person *m_host;    QList<Person *> m_guests;            // 对应的需要将m_guests定义成QList<Person *>类型的成员列表};// ![3]#endif // BIRTHDAYPARTY_H

birthdayparty.cpp:

#include "birthdayparty.h"BirthdayParty::BirthdayParty(QObject *parent): QObject(parent), m_host(0)                  // 初始化参数赋值,这个0相当于NULL{}// ![0]Person *BirthdayParty::host() const{    return m_host;}void BirthdayParty::setHost(Person *c){    m_host = c;}QQmlListProperty<Person> BirthdayParty::guests(){    return QQmlListProperty<Person>(this, m_guests);       // 由一个QList得到QQmlListProperty值,函数原型如下}int BirthdayParty::guestCount() const         // 数据成员一般都为私有,要调用它的函数,我们需要提供一个公共的接口{    return m_guests.count();}Person *BirthdayParty::guest(int index) const{    return m_guests.at(index);}


example.qml:

import People 1.0                   // 由于在main函数中将Person与Birthdayparty的名称空间均注册为People 1.0,导入它我们可以同时使用这两个类型// ![0]BirthdayParty {    host: Person {                 // host参数为单Person        name: "Bob Jones"        shoeSize: 12    }    guests: [                      // guests参数为多Person        Person { name: "Leo Hodges" },        Person { name: "Jack Smith" },        Person { name: "Anne Brown" }    ]}// ![0]

main.cpp:

#include <QCoreApplication>#include <QQmlEngine>#include <QQmlComponent>#include <QDebug>#include "birthdayparty.h"#include "person.h"int main(int argc, char ** argv){    QCoreApplication app(argc, argv);//![register list]    qmlRegisterType<BirthdayParty>("People", 1,0, "BirthdayParty");         // QML类型注册    qmlRegisterType<Person>("People", 1,0, "Person");//![register list]    QQmlEngine engine;    QQmlComponent component(&engine, QUrl("qrc:example.qml"));    BirthdayParty *party = qobject_cast<BirthdayParty *>(component.create());    if (party && party->host()) {                                       // 由于host为"Bob Jones",该if得以进入        qWarning() << party->host()->name() << "is having a birthday!";        qWarning() << "They are inviting:";        for (int ii = 0; ii < party->guestCount(); ++ii)          // 调用公共接口得到客人数            qWarning() << "   " << party->guest(ii)->name();      // 逐一访问其姓名    } else {        qWarning() << component.errors();    }    return 0;}


0 0
原创粉丝点击