我正在使用PySide(Qt)开发一个GUI项目,并计划将所有后端/模型代码保存在python中。使用普通的Qt Widgets看起来很容易,因为很容易保存对窗口小部件的引用,然后根据需要更新属性。然而,我随后看到了QtQuick,并开始朝那个方向前进。我遇到的问题是我似乎无法弄清楚如何从Python访问QML元素。例如,假设我有一个只有Text
元素的QML文件,我想在某个频率上更新它。如何才能访问Text
元素才能设置text
属性?完成此任务的标准方法是什么?
更新 - 标记的答案基本上是我正在使用的一些附加内容。在答案发布前不久,我找到了解释所有选项的参考页面(http://qt-project.org/doc/qt-4.8/qtbinding.html)。我正在采取的方法是设置一个具有我想在QML元素中更新的属性的类,将对象传递给setContextProperty(),在QML中引用object.property然后确保设置了通知信号,所以任何更改为对象将反映在QML中。我稍后会发布我的代码,以便其他人可以看到它以供将来参考。
答案 0 :(得分:2)
您只能访问大多数顶级元素属性。 “正确”的方式应该是使用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 时,您确实使用 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)导出的后端变量。
我希望这对你有所帮助。