2017-10-23 18 views
0

pyqt5からqmlに辞書のリストを渡したい場合、このリストはmodelListView要素になります。次のコードは、私がこれまで持っていたものです。pyqt5からqmlへのオブジェクトのリストの返り値は未定義です

main.py

class MainWindow(QQuickView): 

    def __init__(self, parent=None): 
     super().__init__(parent) 
     self.model = model.PersonModel() 
     self.rootContext().setContextProperty('PersonModel', self.model) 
     self.rootContext().setContextProperty('MainWindow', self) 
     self.setSource(QUrl('main.qml')) 

    @pyqtSlot() 
    def personsList(self): 
     print(self.model.persons) # this prints the list of objects perfectly fine 
     return(self.model.persons) 
     . 
     . 
     . 

main.qml

ListView { 
    id: listExample 
    anchors.fill: parent 
    model: MainWindow.personsList() 
    delegate: PersonDelegate { } 
    highlight: highlightComponent 
    highlightMoveDuration: 0 
    Component.onCompleted: { 
     console.log(">>>", MainWindow.personsList()) // returns undefined, but why?? 
    } 
} 

model.py

from PyQt5.QtCore import QAbstractListModel, Qt, QModelIndex 

class PersonModel(QAbstractListModel): 

    NAME_ROLE = Qt.UserRole + 1 
    AGE_ROLE = Qt.UserRole + 2 

    def __init__(self, parent=None): 
     super().__init__(parent) 
     self.persons = [ 
      {'name': 'jon', 'age': 20}, 
      {'name': 'jane', 'age': 25}, 
      {'name': 'pete', 'age': 25}, 
      {'name': 'winson', 'age': 25}, 
      {'name': 'ben', 'age': 25}, 
      {'name': 'jiahao', 'age': 25}    
     ] 

     self.currentIndex = 0 

    def data(self, index, role=Qt.DisplayRole): 
     row = index.row() 
     if role == PersonModel.NAME_ROLE: 
      return self.persons[row]["name"] 
     if role == PersonModel.AGE_ROLE: 
      return self.persons[row]["age"] 

    def rowCount(self, parent=QModelIndex()): 
     return len(self.persons) 

    def roleNames(self): 
     return { 
      PersonModel.NAME_ROLE: b'name', 
      PersonModel.AGE_ROLE: b'age' 
     } 

    def updateIndex(self, int): 
     self.currentIndex = int 
     print("updating index from click", self.currentIndex) 

    def addPerson(self, name, age): 
     self.beginInsertRows(QModelIndex(), self.rowCount(), self.rowCount()) 
     self.persons.append({'name': name, 'age': age}) 
     self.endInsertRows() 

    def insertPerson(self, row, name, age): 
     self.beginInsertRows(QModelIndex(), row, row) 
     self.persons.insert(row, {'name': name, 'age': age}) 
     self.endInsertRows() 

    def editPerson(self, row, name, age): 
     ix = self.index(row, 0) 
     self.persons[row] = {'name': name, 'age': age} 
     self.dataChanged.emit(ix, ix, self.roleNames()) 

    def deletePerson(self, row): 
     self.beginRemoveColumns(QModelIndex(), row, row) 
     del self.persons[row] 
     self.endRemoveRows() 

はなぜ人々のリストはQMLでundefinedを返すのですか?

私はモデルのクラスを作成しようとしていますが、辞書のリストを渡してこのリストを別のListView要素のmodelプロパティとして使用してインスタンス化できます。このモデルクラスでは、私はaddinserteditdeleteを持っています。すべてのインスタンスで一貫して使用でき、繰り返しを避けることができます。

また、私はデータの流れ、すなわちqmlは、任意のユーザインタラクションのパイソンを通知し、model内のすべての変更はいつでもmodel QMLはそれに応じて変更されるのpythonに処理される一つの方法であるように、ビューからモデルを分離しようとしています変更。 Qtので

+0

@pyqtSlot(result=list) def personsList(self): print(self.model.persons) return self.model.persons 

あなたのQMLのコードで観察されたエラーは、あなたの代わりにモデルのオブジェクトの一覧をリストビューするモデルとして渡しているということですモデルのサンプルがエラーであるかどうかを分析するのに十分でないコードは、完全なモデルのコードを配置することができます。 – eyllanesc

+0

hiylylanesc!私は編集し、私の質問に完全なmodel.pyを配置しました。 – eugeneoei

+0

qmlでPythonと対話する方法は適切ではありませんが、本当に何をしたいですか? – eyllanesc

答えて

0

それはQMLから使用できるように、それに相当するが、我々はそれがresultパラメータを使用して返すデータの種類をあなたに伝える必要がありpyqtSlot()あるPyQtはに、機能を有効にして登録するQ_INVOKABLEマクロがあります。

import QtQuick 2.6 

ListView { 
    id: listExample 
    anchors.fill: parent 
    model: PersonModel 
    delegate: Text{ 
     text: name 
    } 
    highlightMoveDuration: 0 
    Component.onCompleted: { 
     console.log(">>>", MainWindow.personsList()) // returns undefined, but why?? 
     var l = MainWindow.personsList(); 
     for(var counter in l){ 
      console.log(l[counter]['name'] + ": " + l[counter]['age']) 
     } 
    } 
} 

出力:

[{'name': 'jon', 'age': 20}, {'name': 'jane', 'age': 25}] 
qml: >>> [[object Object],[object Object]] 
[{'name': 'jon', 'age': 20}, {'name': 'jane', 'age': 25}] 
qml: jon: 20 
qml: jane: 25 
関連する問題