【问题标题】:How to bind to root context object signal from QML如何从 QML 绑定到根上下文对象信号
【发布时间】:2014-05-20 14:52:15
【问题描述】:

我正在创建 QML 应用程序 (QT 5.2)

假设我有一些对象设置为根上下文:

viewer.rootContext()->setContextObject(&view_model);

现在我想绑定到来自 QML 的 view_model 信号:

Connections {
    target: ??? WHAT SHOULD GO HERE ???
    onSignalStateChanged: console.log("signal")
}

无法确定目标应该是什么。

重要提示:我不想使用setContextProperty

【问题讨论】:

  • Important: I don't want to use setContextProperty. 有什么好的理由吗?
  • 整个想法是提供对 data_context 的 QML 访问作为一个入口点。因此,当我每次要使用 setContextProperty 时,我都需要添加“dataContext”。前缀,这有点烦人。结果,我们用它来创建我们需要的 1 个连接;)
  • "当我每次使用 setContextProperty 时,我都需要添加“dataContext”。前缀,这有点烦人” - 嗯,不,你没有。没有什么要求它。如果理解您的问题,那是您没有获得用于连接语法的标识符,因为 QML 没有为上下文对象提供这样的标识符。在这种情况下,您必须使用setContextProperty 才能获得。
  • 也许我当时误解了文档。无论如何,我的目标是避免使用“setContextProperty”。我的想法是:“如果我设置了整个上下文对象,我为什么需要它?”
  • 也许你做到了。有大量关于将 C++ 对象暴露给 QML 的文章并非巧合,它们都涉及setContextProperty() 方法,而没有一篇涉及设置上下文对象。

标签: qt qml signals-slots


【解决方案1】:

如果您无权访问对象实例(例如通过上下文属性),您似乎无法使用Connections。但是您仍然可以使用以下内容:

function onSignal() {
    console.log( "signal" );
}
Component.onCompleted: {
    onSignalStateChanged.connect( onSignal );
}

【讨论】:

  • 我是否理解正确,您在创建对象后立即在此处动态创建连接?我会试试它是否有效。
  • 是的,完全正确。我试图寻找其他方法,但没有成功。我花了几个小时才找到它...
  • 在此之前我必须使用QQmlContext* context = m_quickViewPtr->rootContext(); context->setContextObject( this ); context->setContextProperty( QStringLiteral( "plugin" ), this );
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多