目录
QML可以很容易地通过c++代码中定义的功能进行扩展。由于QML引擎与Qt元对象系统的紧密集成,任何由qobject派生类适当公开的功能都可以从QML代码访问。这使得可以直接从QML访问c++数据和函数,通常很少或不需要修改。QML引擎能够通过元对象系统对QObject实例进行内省。这意味着任何QML代码都可以访问qobject派生类实例的以下成员:
- Properties (属性)
- Methods (providing they are public slots or flagged with Q_INVOKABLE) (方法)
- Signals (信号)
(此外,如果使用Q_ENUMS声明了枚举,那么枚举也是可用的。详见QML和c++之间的数据类型转换。)
通常,无论qobject派生类是否已注册到QML类型系统,都可以从QML访问这些类。但是,如果以一种需要引擎访问附加类型信息的方式使用类——例如,如果将类本身用作方法参数或属性,或者以这种方式使用其枚举类型之一则可能需要注册该类。
还要注意,本文档中涉及的许多重要概念在使用c++编写QML扩展教程中得到了演示。
1.数据类型处理和所有权
从c++传输到QML的任何数据,无论是作为属性值、方法参数或返回值,还是作为信号参数值,都必须是QML引擎支持的类型。
默认情况下,该引擎支持许多Qt c++类型,并可以在从QML中使用时自动将它们转换为适当的类型。此外,向QML类型系统注册的c++类可以用作数据类型,如果适当地注册,它们的枚举也可以用作数据类型。有关更多信息,请参阅QML和c++之间的数据类型转换。
此外,数据所有权规则也有缺点
2.暴露属性
可以使用Q_PROPERTY()宏为任何从qobject派生的类指定属性。属性是具有关联的读函数和可选的写函数的类数据成员。qobject派生类的所有属性都可以从QML访问。
例如,下面是一个具有作者属性的Message类。正如Q_PROPERTY宏调用所指定的那样,这个属性通过author()方法可读,通过setAuthor()方法可写:
class Message : public QObject
{
Q_OBJECT
Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)
public:
void setAuthor(const QString &a) {
if (a != m_author) {
m_author = a;
emit authorChanged();
}
}
QString author() const {
return m_author;
}
signals:
void authorChanged();
private:
QString m_author;
};
如果在加载名为MyItem的文件时将该类的一个实例设置为上下文属性。从c++) qml:
int main(int argc, char *argv[]) {
QGuiApplication app(argc, argv);
QQuickView view;
Message msg;
view.engine()->rootContext()->setContextProperty("msg", &msg);
view.setSource(QUrl::fromLocalFile("MyItem.qml"));
view.show();
return app.exec();
}</

本文档介绍了如何在QML中通过C++扩展功能,重点讨论数据类型处理、所有权规则、属性暴露(包括对象类型和列表类型属性)、方法(包括Qt插槽)的公开以及信号的访问。QML能够直接访问Q_OBJECT派生类的属性、公共槽和信号,而Q_PROPERTY用于指定可读写属性。对象类型属性和列表属性可通过QML类型系统注册来访问,同时注意数据所有权和类型转换。方法的Q_INVOKABLE和公共槽可用于从QML调用,而信号则允许双向通信。

1021

被折叠的 条评论
为什么被折叠?



