从Qt5后,引入了QML,以前一直用C++开发,现在看了看QML,以啃官方文档为主,将学习心得记录下来。
QML 与 C++ 交互主要用到了一个注册函数 qmlRegisterType ,函数原型如下:
template<typename T>
int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);
template<typename T, int metaObjectRevision>
int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);
uri 表示在 QML 文件中 import 时的名称,versionMajor 和 versionMinor 表示版本号, qmlName 表示要导出的类名。
例如在 C++ 代码中注册如下:
int main(int argc, char *argv[])
{
// ...
qmlRegisterType<MySliderItem>("qmlcomponents", 1, 0, "Slider");
// ...
}
在 QML 中引用如下:
//example.qml
import qmlcomponents 1.0
Slider {
// ...
}
官方提供了一个示例 adding, 这里我们以官方示例作为讲解。
示例组成如下:一个 Person 类,pro 文件,main.cpp 文件,及一个 qml 文件
1. 首先 pro 文件里添加 qml 支持
QT = core qml
SOURCES += main.cpp \
person.cpp
HEADERS += person.h
RESOURCES += adding.qrc
target.path = $$[QT_INSTALL_EXAMPLES]/qml/referenceexamples/adding
INSTALLS += target
2. Person 类里使用 Q_PROPERTY 导出属性 name 和 shoeSize,以便 QML 访问
//Person.h
#ifndef PERSON_H
#define PERSON_H
#include <QObject>
class Person : public 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;
};
#endif
// 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;
}
3. 在 main.cpp 中注册 Person 类
qmlRegisterType<Person>("People", 1,0, "Person");
然后在 qml 中导入 Person
// example.qml
import People 1.0
Person {
name: "Bob Jones"
shoeSize: 12
}
最后在 main.cpp 中访问 example.qml 中的属性值
// main.cpp
#include <QCoreApplication>
#include <QQmlEngine>
#include <QQmlComponent>
#include <QDebug>
#include "person.h"
int main(int argc, char ** argv)
{
QCoreApplication app(argc, argv);
//注册Person类
qmlRegisterType<Person>("People", 1,0, "Person");
// 访问qml
QQmlEngine engine;
QQmlComponent component(&engine, QUrl("qrc:example.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;
}
程序运行结果如下:
The person's name is "Bob Jones"
They wear a 12 sized shoe