StupidBeauty
Read times:1861Posted at: - no title specified

Qt5.4文档翻译:QQmlContext,QQmlContext Class

QQmlContext 类在QML 引擎中定义了一个上下文。 详细说明……

头文件:

#include <QQmlContext>

qmake指令

QT += qml

继承

QObject .

详细说明

QQmlContext 类在QML 引擎中定义了一个上下文。

上下文,可用来将数据暴露给该QML 引擎所实例化的QML 组件。

每个 QQmlContext ,都包含一组与其 QObject 属性不同概念的属性,使得,数据 可以显式地按照名字来与上下文绑定起来。 上下文属性是通过调用 QQmlContext::setContextProperty ()来定义及更新的。 以下代码,展示的是, 一个Qt 模型被绑定到一个上下文了,因而可以通过QML 文件来访问到。

QQmlEngine engine;

QStringListModel modelData;

QQmlContext *context = new QQmlContext (engine.rootContext());

context-> setContextProperty ("myModel", &modelData);

QQmlComponent component(&engine);

component.setData("import QtQuick 2.0\nListView { model: myModel }", QUrl ());

QObject *window = component.create(context);

注意 ,创建者要负责将它所构造的任何 QQmlContext 删除掉。 在这个例子中, window 这个组件实例被销毁时, 如果 不再需要 context 对象了 则, context 应当 显式地销毁。 最简单的实现方式就是,将 window 设置为 context 的亲代对象。

为了简化绑定及维护较大数据集的工作,可将一个上下文对象设置给某个 QQmlContext 该上下文对象的所有属性,都可以在该上下文中按照名字来访问,就好像它们是被通过 QQmlContext::setContextProperty () 一个个地添加进去的一 该属性值的变化,是通过该属性的通知信号来检测到的。设置 一个上下文对象, 与手动地添加及维护上下文属性值相比,既要快一些,又要容易一些。

以下示例,产生的效果与前面一个示例相同,但是,它会使用一个上下文对象。

class MyDataSet : ... {

...

Q_PROPERTY( QAbstractItemModel *myModel READ model NOTIFY modelChanged)

...

};

MyDataSet myDataSet;

QQmlEngine engine;

QQmlContext *context = new QQmlContext (engine.rootContext());

context-> setContextObject (&myDataSet);

QQmlComponent component(&engine);

component.setData("import QtQuick 2.0\nListView { model: myModel }", QUrl ());

component.create(context);

所有 显式通过 QQmlContext::setContextProperty ()添加的属性,其优先级都比其上下文对象的属性的优先级要高。

上下文层级关系

上下文之间会形成一个层级关系。 此层级关系的根,即为该QML 引擎的 根上下文 。子代 上下文会继承其亲代上下文的上下文属性;如果某个子代 上下文设置了某个已经在其亲代上下文中存在的上下文属性,则, 新的上下文属性会覆盖掉亲代的上下文属性。

下面 这个示例,定义了两个上下文—— context1 context2 。第二 个上下文,使用一个新的值覆盖掉了它从第一个上下文所继承到的"b"上下文属性。

QQmlEngine engine;

QQmlContext *context1 = new QQmlContext (engine.rootContext());

QQmlContext *context2 = new QQmlContext (context1);

context1-> setContextProperty ("a", 12);

context1-> setContextProperty ("b", 12);

context2-> setContextProperty ("b", 15);

尽管,在一个上下文中实例化的QML对象并不严格地属于该上下文,但是,它们的绑定却是属性该上下文的。如果某个上下文被销毁了,则,残留的那些QML 对象的属性绑定就不起作用了。

警告: 在某个对象已经被创建之后,再设置其上下文对象或者添加新的上下文属性的话,其开销是狠昂贵的(会导致所有的绑定都重新算值)。因此,在可能的情况下,应当做完了该上下文的“设置”之后,再用它来创建任何的对象。

参考 C++ 类型的属性暴露给 QML

http://www.kanunu8.com/book3/7781/170819.html

Your opinions

Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands