【问题标题】:QML: How to access context property if its name is shadowed by a component-local property?QML:如果其名称被组件本地属性隐藏,如何访问上下文属性?
【发布时间】: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


【解决方案1】:

你没有。使用text 作为上下文属性的名称是最糟糕的选择。使用blahblah 确实会做得更好。为什么要招惹麻烦?

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

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

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

【讨论】:

  • text: text 正是我在这个最小示例中使用的。在实际代码中是sharedGLData: sharedGLData。 “将根对象公开为动态范围属性”是指“为根对象分配一个 id”吗?如果是这样,那么 一个有效的解决方案,谢谢(虽然我不太喜欢它)。它确实具有您描述的性能优势。
  • 我的意思是既分配一个 id,又把它分配给该对象的一个​​属性。通常,您不能通过 id 从另一个源访问对象,因此需要属性,命名以便它不会被遮蔽。至于名称,暗示的是,以一种已知容易发生名称解析冲突的方式命名事物是一种不好的做法。试试C_sharedGLData,它也告诉你它是一个上下文属性。
猜你喜欢
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2017-01-29
相关资源
最近更新 更多