在 pyside2 中将 Python 列表属性注册到 QML [英] Registering a Python list property to QML in pyside2

查看:87
本文介绍了在 pyside2 中将 Python 列表属性注册到 QML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试加载电子表格并将工作表列表传回我的 QML 界面.但是我无法找到一种方法来向 QML 脚本提供列表(以及后来的字典).

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 to the QML script.

这是我的 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")
    }
}

这是我的python类:

Here's the my python class:

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)

当我打开电子表格时,输出是:

When I open a spreadsheet, the output is:

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

第一行显示 python 的列表正确,第二行我在 QML 中的脚本成功获取了一个字符串属性,但第三行没有正确获取列表属性.

The first line shows that python has the list correct, in the second my script in the QML is successfully getting a string property, but the third isn't getting the list property properly.

推荐答案

你必须使用 QVariantList 而不是 list,除了使用正则表达式可能会失败,我的情况我使用 Linux,我产生问题,所以正确的做法是使用 QUrl:

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()

输出:

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

这篇关于在 pyside2 中将 Python 列表属性注册到 QML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆