您的位置:首页 > 编程语言 > Qt开发

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

2014-07-06 22:39 731 查看
本系列所有文章可以在这里查看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.0
import People 1.0

BirthdayParty {
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则是在组件加载完成后才"被邀请"的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: