【发布时间】:2018-03-21 09:39:36
【问题描述】:
我有一个 main.qml,里面有两个横幅(titlebanner 和 bottombanner),如下所示。
Window {
id: main
visible: true
Image {
source: "qrc:/banner.png"
anchors.fill: parent
}
TitleBanner {
x:0
y:10
}
BottomBanner {
x:0
y:420
}
}
在 TitleBanner.qml 中,我有以下代码
Item {
Rectangle {
id : id_title_banner
property real value : titlebanner.title
Image {
source: "qrc:/banner_title.png";
}
//todo:: some animation stuffs on 'value' later
}
}
在 BottomBanner.qml 中,我有以下代码
Item {
Rectangle {
id : id_bottom_banner
property real value : bottombanner.title
Image {
source: "qrc:/banner_bottom.png";
}
//todo:: some animation stuffs on 'value' later
}
}
在 C++ 方面,我为标题横幅和底部横幅保留了两个单独的对象(为了以后的灵活性)。我设置了根上下文属性以将标题横幅对象从 C++ 公开到 qml,如下所示
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
//create title banner object
CTitleBanner *objTitleBanner = new CTitleBanner();
//create bottom banner object
CBottomBanner *objBottomBanner = new CBottomBanner();
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("titlebanner", objTitleBanner);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
我的问题是,我们如何分别为 titlebanner 和 bottombanner qml 文件设置上下文属性,而不是将其设置为根上下文?我担心的是,如果以后有更多横幅出现,我将其设置为 rootContext。这是一种正确的做法吗?我们如何为每个横幅创建单独的上下文?
【问题讨论】:
-
"它替换了上面的上下文属性。"可以?我不想尝试。如果是这样的话。你为什么不创建一个
QObject contextData,它有两个属性:titlebanner和bottombanner,你将它们设置为(可能是巧合?)你的两个原始横幅对象。但是我认为我最初的问题的答案应该是“不”。 -
@derM,对不起,我的问题有更正,我已经编辑了相同的内容。是的。你的观点是正确的,它不会取代我之前尝试过的上下文。请查看我编辑的问题。
-
我没有收到你的新问题。会有多少条横幅? C++ 会对此产生什么影响?由于 QML 更灵活,您应该努力使您的 C++ 部分尽可能不可变。在 C++ 中创建一个稳定 数据模型,仅在 QML 中实现视觉表示的魔力。如果例如,您可能会在 C++ 中创建某种内容模型。可能需要访问数据库。 C++ 部分应该不知道视图中有什么。
-
@derM,在上面的示例中,我正在为根上下文设置 contextProperty。所以我可以从我所有的 qml 文件中访问横幅对象。例如,在 BottomBanner.qml 文件中,我也可以访问“objTitleBanner”。我在想这是一种首选的方式吗?稍后,我计划添加更多横幅(比如大约 20 个横幅)。所以最后我们可以从任何 qml 文件中访问所有横幅对象。我不知道这是不是 qt 的开销。是这样吗?所以我在想我们可以设置一个特定于 qml 文件的上下文。例如,从 TitleBanner.qml 我只能访问“objTitleBanner”。
-
设置上下文属性实际上只是将属性设置到 QML 对象树的最根目录。这意味着,QML 将遵循常规的名称解析算法(查看当前范围,查看文件根范围,查看实例化该文件的文件的根范围等,直到它到达根上下文 - 或失败)。在一个范围内,查找应该很快,因为它(afaik)被实现为某种地图。拥有 20 个上下文属性比尝试从深度嵌套的对象中访问它的问题要小。