pyqt5からqmlに辞書のリストを渡したい場合、このリストはmodel
のListView
要素になります。次のコードは、私がこれまで持っていたものです。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
プロパティとして使用してインスタンス化できます。このモデルクラスでは、私はadd
、insert
、edit
、delete
を持っています。すべてのインスタンスで一貫して使用でき、繰り返しを避けることができます。
また、私はデータの流れ、すなわちqml
は、任意のユーザインタラクションのパイソンを通知し、model
内のすべての変更はいつでもmodel
QMLはそれに応じて変更されるのpythonに処理される一つの方法であるように、ビューからモデルを分離しようとしています変更。 Qtので
あなたのQMLのコードで観察されたエラーは、あなたの代わりにモデルのオブジェクトの一覧をリストビューするモデルとして渡しているということですモデルのサンプルがエラーであるかどうかを分析するのに十分でないコードは、完全なモデルのコードを配置することができます。 – eyllanesc
hiylylanesc!私は編集し、私の質問に完全なmodel.pyを配置しました。 – eugeneoei
qmlでPythonと対話する方法は適切ではありませんが、本当に何をしたいですか? – eyllanesc