Registro de una propiedad de lista de Python en QML en pyside2

Estoy tratando de cargar una hoja de cálculo y pasar una lista de las hojas de trabajo a mi interfaz QML. Pero no puedo encontrar una manera de proporcionar una lista (y luego un diccionario) al script QML.

Aquí está mi QML:

FileDialog { id: openDialog title: "Open spreadsheet" nameFilters: [ "Excel files (*.xls *.xlsx)", "All files (*)" ] selectedNameFilter: "Excel files (*.xls *.xlsx)" onAccepted: { file.load(fileUrl) console.log(file.name) console.log(file.sheetnames) } onRejected: { console.log("Rejected") } } 

Aquí está la clase de mi python:

 class File(QtCore.QObject): def __init__(self, *args, **kwargs): super(File, self).__init__(*args, **kwargs) self.__filename = "" self.__sheetnames = list() @QtCore.Slot(str) def load(self, filename): self.__filename = re.sub(r'^[a-zA-Z]+:/+', '', filename) # Load the worksheet using openpyxl. try: workbook = openpyxl.load_workbook(filename=self.__filename) except openpyxl.utils.exceptions.InvalidFileException as exception: # Todo: write code to pass error to the user. print('Invalid File') return self.__sheetnames = workbook.sheetnames print(workbook.sheetnames) def set_filename(self): return self.__filename def get_filename(self, name): self.__filename = name def get_sheetnames(self): return self.__sheetnames def set_sheetnames(self, names): self.__sheetnames = names name = QtCore.Property(str, set_filename, get_filename) sheetnames = QtCore.Property(list, get_sheetnames, set_sheetnames) 

Cuando abro una hoja de cálculo, la salida es:

 ['Sheet1'] qml: C:/path/to/my/spreadsheet.xlsx qml: QVariant(PySide::PyObjectWrapper) 

La primera línea muestra que Python tiene la lista correcta, en el segundo mi script en el QML está obteniendo una propiedad de cadena, pero la tercera no está obteniendo la propiedad de la lista correctamente.

Tiene que usar QVariantList lugar de la lista, además el uso de expresiones regulares puede fallar, en mi caso yo uso Linux y genero problemas, así que lo correcto es usar QUrl :

 class File(QtCore.QObject): filenameChanged = QtCore.Signal() sheetnamesChanged = QtCore.Signal() def __init__(self, *args, **kwargs): super(File, self).__init__(*args, **kwargs) self.__filename = "" self.__sheetnames = list() @QtCore.Slot(str) def load(self, filename): self.__filename = QtCore.QUrl(filename).toLocalFile() # Load the worksheet using openpyxl. try: workbook = openpyxl.load_workbook(filename=self.__filename) except openpyxl.utils.exceptions.InvalidFileException as exception: # Todo: write code to pass error to the user. print('Invalid File') return self.__sheetnames = workbook.sheetnames print(workbook.sheetnames) @QtCore.Property(str, notify=filenameChanged) def filename(self): return self.__filename @filename.setter def get_filename(self, name): if name == self.__filename: return self.__filename = name self.filenameChanged.emit() @QtCore.Property('QVariantList', notify=sheetnamesChanged) def sheetnames(self): return self.__sheetnames @sheetnames.setter def set_sheetnames(self, names): if names == self.__sheetnames: return self.__sheetnames = names[:] self.sheetnamesChanged.emit() 

Salida:

 ['Periodic Table'] qml: /home/eyllanesc/Downloads/Ultimate Periodic Table1.xlsx qml: [Periodic Table]