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;
}因为没有界面。实际执行就是一行控制台的输出:
浙公网安备 33010602011771号