从宿主语言更新 QML 属性需要啥?

Posted

技术标签:

【中文标题】从宿主语言更新 QML 属性需要啥?【英文标题】:What is necessary to update QML properties from the host language?从宿主语言更新 QML 属性需要什么? 【发布时间】:2014-07-08 00:29:36 【问题描述】:

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

更新 - 标记的答案本质上是我正在使用的添加一些内容。在发布答案前不久,我找到了解释所有选项的参考页面 (http://qt-project.org/doc/qt-4.8/qtbinding.html)。我正在采取的方法是设置一个具有我想在 QML 元素中更新的属性的类,将对象传递给 setContextProperty(),在 QML 中引用 object.property,然后确保设置了通知信号,所以任何对对象的更改将反映在 QML 中。我稍后会发布我的代码,以便其他人可以看到它以供将来参考。

【问题讨论】:

【参考方案1】:

您只能访问最顶部的元素属性。 “正确”的方式应该是使用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) 导出的后端变量。

希望对你有所帮助。

【讨论】:

我发现我缺少的参考页面解释了将数据输入或输出 qml 的各种选项,但您的描述基本上也是我得出的结论。谢谢

以上是关于从宿主语言更新 QML 属性需要啥?的主要内容,如果未能解决你的问题,请参考以下文章

从 QAbstractListModel 继承的列表模型,列表项属性不会从 QML 更新

如何从 C++ 中删除属性上的 QML 绑定?

Qt Quick编程——QML的核心部分ECMAScript

从高度动态的 C++ 数据模型更新 QML:计时器与属性绑定

QML 对象不更新显示

使用信号或 Q_PROPERTY 更新 QML 对象