我正在使用 PySide (Qt) 开发一个 GUI 项目,并计划将所有后端/模型代码保留在 python 中。这对于普通的 Qt Widgets 来说看起来很容易,因为很容易保存对 widget 的引用,然后根据需要更新属性。然而,我随后看到了 QtQuick 并开始朝那个方向发展。我遇到的问题是我似乎无法弄清楚如何从 Python 访问 QML 元素。例如,假设我有一个只有 Text
元素的 QML 文件,我想以一定的频率更新它。我将如何获得对 Text
元素的访问权限以便能够设置 text
属性?实现这一目标的标准方法是什么?
更新 - 标记的答案基本上是我使用的一些补充。在发布答案前不久,我找到了解释所有选项的引用页 (http://qt-project.org/doc/qt-4.8/qtbinding.html)。我采用的方法是设置一个类,该类具有我想在 QML 元素中更新的属性,将对象传递给 setContextProperty(),在 QML 中引用 object.property,然后确保设置了通知信号,以便任何对对象的更改将反射(reflect)在 QML 中。我稍后会发布我的代码,以便其他人可以看到它以供将来引用。
最佳答案
您只能访问最顶层的元素属性。 “正确”的方式应该是使用 alias properties .例如,如果您想要定义一个 Label 元素(只是一个预配置的 Text 元素),您应该这样做:
// Label.qml
Item{
id: root
property alias text: txLabel.text
Text{
id: txLabel
anchors{ fill: parent; margins: 4 }
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
// ... other stuff
}
}
每次您设置到 Label.text 或从 Label.text 获取时,您实际上是在使用 txLabel.text。
我不知道如何将变量从 PySide 公开到 QML 引擎,但它应该像 C++:setContextProperty() 函数或其他东西。所以,为了使用我们的 Label 组件。我们可以做到:
// OurPage.qml
Item{
id: root
width: 800; height: 600
Text{
id: txCaption
anchors{ centerIn: parent }
text: qsTr("My name is:")
}
Label{
anchors{ top: textCaption }
text: myName
}
}
其中 myName 是使用 setContextProperty("myName", pyVarMyName) 导出的后端变量。
希望对你有帮助
关于qt - 从宿主语言更新 QML 属性需要什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24621979/