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

标签 qt qml pyside

我正在使用 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/

相关文章:

python - QListWidget添加后可以刷新吗?

c++ - Qt3D中QGLView(不是QGLWidget)的重绘和渲染后效果

c++ - QQuickImage 转换为 QImage

python qt,在另一个小部件(声子)上方显示文本/标签

c++ - 如何将 QVariant 转换为自定义类?

c++ - 为每种参数类型重新定义相同模式的函数

c++ - QQmlApplicationEngine 和 WindowFlags

python - 如何让 QThreads 在控制台 PySide 程序中工作?

qt - QListView 可以有不同的垂直和水平间距吗?

c++ - MSVS2012 中的 QCustomPlot