【发布时间】:2017-01-09 21:25:30
【问题描述】:
我的代码:
main.cpp:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
int main(int argc, char *argv[]) {
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
engine.rootContext()->setContextProperty("text", "hey");
return app.exec();
}
main.qml:
import QtQuick 2.5
import QtQuick.Window 2.2
Window {
id: window
visible: true
width: 640
height: 480
Text {
text: text
}
}
当然,text: text 行不符合我的要求,因为名称隐藏。
我通过在根对象而不是根上下文上设置属性来解决这个问题,并使用text: window.text。
有什么真正的解决办法吗?
【问题讨论】:
-
不是直接答案,而是:我们应用的代码约定是在上下文变量前加上下划线(因此在您的情况下,它将被称为“_text”)。这在实践中避免了冲突并且它非常清楚地表明该属性来自 C++,因此在 QML 代码中查找它是没有意义的。
-
更好的答案是使用 qmlRegisterSingletonType 而不是 setContextProperty。这种情况下的优点是可以使用合格的导入来访问单例及其属性,从而解决您的名称冲突。
-
另外,单例的查找速度应该更快。
-
你有那个@ddriver 的来源吗?
-
对我来说,单例和上下文属性从设计的角度来看是不可互换的。我的上下文属性是我的 C++ 逻辑层的一部分。单例由 QML 层实例化并拥有,它们在 c++ 中实现的事实只是一个实现细节。
标签: qt syntax properties qml shadowing