将 Python 对象列表传递给 qml

eug*_*oei 5 python pyqt qml pyqt5

我正在尝试将对象列表从 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)
Run Code Online (Sandbox Code Playgroud)

通过以下方式暴露给 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
    }
}
Run Code Online (Sandbox Code Playgroud)

ps:我是 Qml 和 Qt5 的新手。如果我在我的概念中犯了任何基本错误,请告诉我

eyl*_*esc 3

对于在 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
Run Code Online (Sandbox Code Playgroud)

如果我们想成为可编辑的实现设置者,上面的代码将使属性只读,例如:

@fileName.setter
def fileName(self, value):
    self._fileName = value
Run Code Online (Sandbox Code Playgroud)