from PySide2 import QtCore, QtQml, QtGui, QtQuick class MyObject(QtCore.QObject): def __init__(self, name, parent=None): super().__init__(parent) self._name = name def getName(self): return self._name name = QtCore.Property(str, getName) class AbstractListModel(QtCore.QAbstractListModel): def __init__(self, data, parent=None): super().__init__(parent) self._data = data def roleNames(self): return {QtCore.Qt.UserRole + 1: b'name'} def rowCount(self, index): return len(self._data) def data(self, index, role): if not index.isValid(): return None attr = self.roleNames()[role].decode('utf-8') elem = self._data[index.row()] return getattr(elem, attr) class ConcreteModel(AbstractListModel): def __init__(self, parent=None): data = [MyObject('1'), MyObject('2')] super().__init__(data, parent) class ConcreteModelWorking(QtCore.QAbstractListModel): def __init__(self, parent=None): super().__init__(parent) self._data = [MyObject('1'), MyObject('2')] def roleNames(self): return {QtCore.Qt.UserRole + 1: b'name'} def rowCount(self, index): return len(self._data) def data(self, index, role): if not index.isValid(): return None attr = self.roleNames()[role].decode('utf-8') elem = self._data[index.row()] return getattr(elem, attr) def main(): app = QtGui.QGuiApplication([]) QtQml.qmlRegisterType(MyObject, 'Test.Lib', 1, 0, 'MyObject') QtQml.qmlRegisterType(ConcreteModel, 'Test.Lib', 1, 0, 'ConcreteModel') view = QtQuick.QQuickView() view.setSource(QtCore.QUrl('bug.qml')) view.show() app.exec_() if __name__ == '__main__': main()