从宿主语言更新QML属性有什么必要?

时间:2014-07-08 00:29:36

标签: qt qml pyside

我正在使用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中。我稍后会发布我的代码,以便其他人可以看到它以供将来参考。

1 个答案:

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

我希望这对你有所帮助。