首页 > 代码库 > Qt5官方demo解析集21——Extending QML - Adding Types Example

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

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


又是一个新的系列了,不过这个系列和我们之前的Chapter系列是及其相似的,但是不过呢,Chapter主要演示了如何使用C++创建具有可视性的类型以扩展我们的QML,而这个系列则关注于如何使用C++扩展QML非可视化的内容。

这里第一个小例子与Chapter的第一个小例子及其类似:


person是我们自定义的C++类,然后我们将其注册为QML类型供资源文件中的example.qml使用。

person.h,这个类与之前的piechart没有太大区别:

#ifndef PERSON_H
#define PERSON_H

#include <QObject>
//![0]
class Person : public QObject             // 要注意的是由于这个对象并不需要可视化,我们继承最基础的QObject就可以了
{                                         
    Q_OBJECT                              // 因为QML组件基于元对象系统,所以QObject和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;
};
//![0]

person.cpp:

#include "person.h"

// ![0]
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;
}

example.qml:

import People 1.0

Person {                 // 非可视化组件,我们也不再需要以Item作为父对象
    name: "Bob Jones"
    shoeSize: 12
}

main.cpp:

#include <QCoreApplication>           // 注意到Chapter中为QGuiApplication
#include <QQmlEngine>                 // 提供QML组件的运行环境
#include <QQmlComponent>              // 提供对QML组件的封装与访问
#include <QDebug>
#include "person.h"

int main(int argc, char ** argv)
{
    QCoreApplication app(argc, argv);
//![0]
    qmlRegisterType<Person>("People", 1,0, "Person");            // 注册QML类型
//![0]

    QQmlEngine engine;
    QQmlComponent component(&engine, QUrl("qrc:example.qml"));    // 获取QML文件中的组件
    Person *person = qobject_cast<Person *>(component.create());  // 创建该组件的实例化对象
    if (person) {
        qWarning() << "The person's name is" << person->name();   // 依然是通过->访问其成员函数
        qWarning() << "They wear a" << person->shoeSize() << "sized shoe";
    } else {
        qWarning() << component.errors();             // 类型转换失败则输出错误信息
    }
    return 0;
}


由于没有界面,实际运行就是一行控制台的输出: