Qt5官方demo解析集25——Extending QML - Methods Example

來源:互聯網
上載者:User

標籤:qml   qmlc++   qtquick   qt5官方demo解析集   extending qml   

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

接上文Qt5官方demo解析集24——Extending QML - Default Property Example


這個例子主要向我們介紹了在QML類型中定義函數的方法。

person.h:

#ifndef PERSON_H#define PERSON_H#include <QObject>class Person : public QObject                       // 基本的person類沒有改變,刪掉了這個demo用不上的Boy和Girl{    Q_OBJECT    Q_PROPERTY(QString name READ name WRITE setName)    Q_PROPERTY(int shoeSize READ shoeSize WRITE setShoeSize)public:    Person(QObject *parent = 0);    QString name() const;    void setName(const QString &);    int shoeSize() const;    void setShoeSize(int);private:    QString m_name;    int m_shoeSize;};#endif // PERSON_H

person.cpp:

#include "person.h"Person::Person(QObject *parent): QObject(parent), m_shoeSize(0){}QString Person::name() const{    return m_name;}void Person::setName(const QString &n){    m_name = n;}int Person::shoeSize() const{    return m_shoeSize;}void Person::setShoeSize(int s){    m_shoeSize = s;}

birthdayparty.h:

#ifndef BIRTHDAYPARTY_H#define BIRTHDAYPARTY_H#include <QObject>#include <QQmlListProperty>#include "person.h"class BirthdayParty : public QObject{    Q_OBJECT    Q_PROPERTY(Person *host READ host WRITE setHost)    Q_PROPERTY(QQmlListProperty<Person> guests READ guests)public:    BirthdayParty(QObject *parent = 0);    Person *host() const;    void setHost(Person *);    QQmlListProperty<Person> guests();    int guestCount() const;    Person *guest(int) const;// ![0]                                            // 這裡定義了一個函數    Q_INVOKABLE void invite(const QString &name);  // 為了在QML中能夠調用該函數,我們需要使用宏Q_INVOKABLE// ![0]                                            // 該宏使得這個函數可以被通過元對象系統調用                                                   // 否則在QML中對其調用時編譯器將抱怨invite未定義private:    Person *m_host;    QList<Person *> m_guests;};#endif // BIRTHDAYPARTY_H

birthdayparty.cpp:

#include "birthdayparty.h"BirthdayParty::BirthdayParty(QObject *parent): QObject(parent), m_host(0){}// ![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);}int BirthdayParty::guestCount() const{    return m_guests.count();}Person *BirthdayParty::guest(int index) const{    return m_guests.at(index);}void BirthdayParty::invite(const QString &name)     // 函數實現{    Person *person = new Person(this);    person->setName(name);    m_guests.append(person);}// ![0]

example.qml:

import QtQuick 2.0import People 1.0BirthdayParty {    host: Person {        name: "Bob Jones"        shoeSize: 12    }    guests: [        Person { name: "Leo Hodges" },        Person { name: "Jack Smith" },        Person { name: "Anne Brown" }    ]// ![0]    Component.onCompleted: invite("William Green")  // 我們需要在一個handler中調用這個函數// ![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);    qmlRegisterType<BirthdayParty>("People", 1,0, "BirthdayParty");    qmlRegisterType<Person>("People", 1,0, "Person");    QQmlEngine engine;    QQmlComponent component(&engine, QUrl("qrc:example.qml"));    BirthdayParty *party = qobject_cast<BirthdayParty *>(component.create());    if (party && party->host()) {        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;}

運行結果:


可以看到前三位客人是作為guests屬性值初始化就存在的,而William Green則是在組件載入完成後才"被邀請"的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.