2017-09-24 62 views
1

我正在嘗試將對象列表從python傳遞給qml。在qml方面,我將解釋這些信息並使用repeater和listmodel元素,以類似的方式在表格中顯示這些信息。將對象的python列表傳遞給qml

如果我只是傳遞一個對象或一個整數列表,我可以讀取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的新手。如果我做我的概念什麼根本性錯誤,請不要讓我知道

+0

[鏈接](http://pyqt.sourceforge.net/Docs/PyQt5/qml.html) – folibis

+0

您可以展示如何將DisplayComponent傳遞給qml和qml。 – eyllanesc

+0

感謝@folibis for link.i根據您給出的鏈接進行了一些更改。 eyllanesc我已經編輯了我的問題。我可以將列表傳遞給qml,但似乎不能讀取對象。有任何想法嗎? – eugeneoei

回答

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制定者,例如:

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

工作!謝謝!我可否澄清一下,如果我的方法適合更新此列表?在這個列表中的狀態將會改變的用戶和qml接口之間會有一些交互。用戶將發表評論,這些評論將被保存爲Python上的txt文件。在成功保存文件時,一個'boolean'值將被返回到qml,其中'ListElement'值將被更新並且UI將根據返回的'boolean'值被更新。這工作流程是否正確? – eugeneoei

+0

也,我應該注意到,如果我想編輯屬性? – eugeneoei

+0

@eugeneoei對我來說這似乎是正確的,但如何修改該文件,我沒有注意到它有一個保存在文件中的函數。你必須爲該屬性創建一個setter,以便可以從qml編輯,我在我的答案結尾處插入了一個示例。請不要忘記標記我的答案是正確的。 – eyllanesc