Registering a Python list property to QML in pyside2

后端 未结 1 1853
时光取名叫无心
时光取名叫无心 2020-12-06 15:43

I\'m trying to load a spreadsheet and pass a list of the worksheets back to my QML interface. But I\'m unable to find a way to provide a list(and later a dictionary) back t

相关标签:
1条回答
  • 2020-12-06 16:11

    You have to use QVariantList instead of list, besides the use of regular expressions may fail, in my case I use Linux and I generate problems, so the correct thing to do is to use 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()
    

    Output:

    ['Periodic Table']
    qml: /home/eyllanesc/Downloads/Ultimate Periodic Table1.xlsx
    qml: [Periodic Table]
    
    0 讨论(0)
提交回复
热议问题