本系列所有文章可以在这里查看[http://blog.csdn.net/cloud_castle/article/category/2123873](http://blog.csdn.net/cloud_castle/article/category/2123873) 又是一个新的系列了,不过这个系列和我们之前的Chapter系列是及其相似的,但是不过呢,Chapter主要演示了如何使用C++创建具有可视性的类型以扩展我们的QML,而这个系列则关注于如何使用C++扩展QML非可视化的内容。 这里第一个小例子与Chapter的第一个小例子及其类似: ![](https://box.kancloud.cn/2016-01-18_569cbd0815180.jpg) 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; } ~~~ 由于没有界面,实际运行就是一行控制台的输出: ![](https://box.kancloud.cn/2016-01-18_569cbd08271ca.jpg)