[英]Registering a Python list property to QML in pyside2
我正在尝试加载电子表格,并将工作表列表传递回我的QML界面。 但是我找不到找到将列表(以及后来的字典)提供回QML脚本的方法。
这是我的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类:
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)
当我打开电子表格时,输出为:
['Sheet1']
qml: C:/path/to/my/spreadsheet.xlsx
qml: QVariant(PySide::PyObjectWrapper)
第一行显示python的列表正确,第二行显示QML中的脚本成功获取字符串属性,但第三行未正确获取list属性。
您必须使用QVariantList
而不是list,除了使用正则表达式可能会失败之外,就我而言,我使用Linux并产生问题,因此正确的做法是使用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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.