【问题标题】:Passing a python list of objects to qml将对象的python列表传递给qml
【发布时间】:2018-03-05 09:18:24
【问题描述】:

我正在尝试将对象列表从 python 传递到 qml。在 qml 方面,我将解释这些信息并使用 repeater 和 listmodel 元素,以类似表格的方式显示这些信息。

如果我只是传递一个对象或整数列表,我可以读取 qml 端的信息。但否则在尝试传递对象列表时。我如何读取 qml 端的对象列表?我必须使用不同的属性吗?

以下是我目前所拥有的:

class File(QObject):
    def __init__(self, fileName, commentsStatus, diagnosisStatus, parent=None):
        QObject.__init__(self, parent)
        self.fileName = fileName
        self.commentsStatus = commentsStatus
        self.diagnosisStatus = diagnosisStatus  

class DisplayComponent(QObject):
    def __init__(self, parent = None):
        QObject.__init__(self, parent)
        self.list = [File("file 1", True, False), File("file 2", False, True)]

    @pyqtProperty(QQmlListProperty)
    def getDicomFilesList(self):
        return QQmlListProperty(File, self, self.list)

通过以下方式暴露于 qml 端: context.setContextProperty("dicomFiles", displayComponent)

这就是我在 qml 端阅读列表的方式:

HanaContainer {

    Text {
        id: display
        text: "no signal detected yet"
    }

    Component.onCompleted: {
        console.log(dicomFiles.getDicomFilesList[1]) // prints File(0x7f8a6d454c70)
        console.log(dicomFiles.getDicomFilesList[1].fileName) // prints undefined
    }
}

ps:我对 Qml 和 Qt5 完全陌生。如果我在我的概念中犯了任何基本错误,请告诉我

【问题讨论】:

  • 您可以展示如何将 DisplayComponent 传递给 qml 和 qml。
  • 感谢@folibis 的链接。我已根据您提供的链接进行了一些更改。 eyllanesc 我已经相应地编辑了我的问题。我可以将列表传递给 qml,但似乎无法读取该对象。有什么想法吗?

标签: python pyqt qml pyqt5


【解决方案1】:

对于在 qml 中可见的属性,这必须是一个属性,为此您应该使用pyqtProperty,如下所示:

class File(QObject):
    def __init__(self, fileName, commentsStatus, diagnosisStatus, parent=None):
        QObject.__init__(self, parent)
        self._fileName = fileName
        self._commentsStatus = commentsStatus
        self._diagnosisStatus = diagnosisStatus

    @pyqtProperty(str)
    def fileName(self):
        return self._fileName

    @pyqtProperty(bool)
    def commentsStatus(self):
        return self._commentsStatus

    @pyqtProperty(bool)
    def diagnosisStatus(self):
        return self._diagnosisStatus

如果我们想成为可编辑的implementetar setter,上面将使属性只可读,例如:

@fileName.setter
def fileName(self, value):
    self._fileName = value

【讨论】:

  • 成功了!谢谢!如果我的方法适合更新此列表,我可以与您澄清一下吗?用户和 qml 界面之间将会有一些交互,该列表中的状态会发生变化。用户将制作 cmets,这些 cmets 将在 python 上保存为 txt 文件。成功保存文件后,boolean 值将返回到 qml,其中ListElement 值将被更新,UI 将根据返回的boolean 值更新。这个工作流程对吗?
  • 另外,如果我想编辑属性,我应该注意什么?
  • @eugeneoei 对我来说这似乎是正确的,但是如何修改文件,我没有注意到它具有保存在文件中的功能。您必须为该属性创建一个可从 qml 编辑的设置器,我在答案的末尾放了一个示例。请不要忘记将我的答案标记为正确。
  • 文件中保存的功能尚未实现。可能下一步我会尝试。感谢您的提示!是的。我确实将其标记为正确,但只会记录 15 名及以上声望的投票。如果有人看到这个,上面的工作!谢谢@eyllanesc!
猜你喜欢
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多