Qt 从宿主语言更新QML属性需要什么?

Qt 从宿主语言更新QML属性需要什么?,qt,qml,pyside,Qt,Qml,Pyside,我正在使用PySide(Qt)进行一个GUI项目,并计划用python保存所有后端/模型代码。对于普通的Qt小部件,这看起来很容易,因为保存对小部件的引用,然后根据需要更新属性很容易。然而,我随后看到了QtQuick,并开始朝这个方向发展。我遇到的问题是,我似乎无法理解如何从Python访问QML元素。例如,假设我有一个QML文件,其中只有一个Text元素,我想以某种频率更新它。如何访问Text元素以设置Text属性?实现这一目标的标准方法是什么 更新-标记的答案基本上就是我所使用的添加内容。在

我正在使用PySide(Qt)进行一个GUI项目,并计划用python保存所有后端/模型代码。对于普通的Qt小部件,这看起来很容易,因为保存对小部件的引用,然后根据需要更新属性很容易。然而,我随后看到了QtQuick,并开始朝这个方向发展。我遇到的问题是,我似乎无法理解如何从Python访问QML元素。例如,假设我有一个QML文件,其中只有一个
Text
元素,我想以某种频率更新它。如何访问
Text
元素以设置
Text
属性?实现这一目标的标准方法是什么


更新-标记的答案基本上就是我所使用的添加内容。在答案发布前不久,我找到了解释所有选项的参考页()。我采用的方法是使用我希望在QML元素中更新的属性设置一个类,将对象传递给setContextProperty(),在QML中引用object.property,然后确保设置了通知信号,以便对对象的任何更改都将反映在QML中。稍后我将发布我的代码,以便其他人可以查看它以供将来参考。

您只能访问大多数顶级元素属性。“正确”的方法应该是使用。例如,如果要定义标签元素(只是预配置的文本元素),则应执行以下操作:

// 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()函数或其他函数。所以,为了使用我们的标签组件。我们可以做到:

// 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)导出的后端变量


我希望这对您有所帮助。

我找到了我丢失的参考页,该页解释了将数据输入或输出qml的各种选项,但您的描述基本上也是我得出的结论。谢谢