QML:如果其名称被组件本地属性遮蔽,如何访问上下文属性?

时间:2017-01-09 21:25:31

标签: qt syntax properties qml shadowing

我的代码:

的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来解决这个问题。

有没有真正的解决办法?

1 个答案:

答案 0 :(得分:0)

你不是。使用text作为上下文属性的名称就像是最糟糕的选择。使用blahblah,您可以做得更好。为什么选择麻烦?

您可以实现别名来访问根对象中的context属性,同时还将根对象公开为动态范围属性。这样做的好处仍然是能够使用上下文属性,同时避免昂贵的动态属性查找一直到根,同时仍然提供替代,尽管效率较低< / s>在被遮蔽的情况下获取上下文属性的方法。

更新:实际上有逻辑上的理由假设上下文属性比常规动态范围对象属性更快查找。在这方面,上面的段落只能用于提供访问被遮蔽属性的辅助标识符。

正如评论中所提到的,单例实际上在这个使用上下文中最有意义,因为它直接从导入而不是涉及查找中解析,而且你可以import as这对于解决名称很有用冲突。如果您希望通过单例显示多个对象,而不是将每个对象公开为单独的单例,您可以只拥有单例的不同对象成员,这些可以作为属性,模型项或任何满足特定需要的内容动态添加。