標籤: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則是在組件載入完成後才"被邀請"的。