我正在尝试加载电子表格,并将工作表列表传递回我的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而不是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]
问题内容: 我是Python的新手,我刚刚发现了属性。当我在一个简单的变量上尝试它时,它工作得很好,但是我无法使其在列表上工作。当执行下面的代码时,它将调用两次getter而不是setter。我知道在我的示例中,该属性没有附加值,但只是为了简化。 有人知道我在做什么错吗? 问题答案: 仅当您直接获取或设置属性时,才使用setter / getter: 如果您修改属性中的元素,则会获得该属性,然后设
问题内容: 我的ViewValue类定义如下: 在我的代码中,我需要将ViewValue实例列表转换为包含来自相应ViewValue的id字段值的列表。 我用foreach循环来做: } 有没有更好的方法来解决这个问题? 问题答案: 编辑:此答案基于以下想法:您需要对代码中其他位置的不同实体和不同属性执行类似的操作。如果您 只需 要按ID将ViewValues列表转换为Longs列表,则请坚持使用
问题内容: 无法下载任何pythonWindows模块并安装。我想尝试使用Scrapy框架和无堆栈框架,但由于错误“需要python版本2.6,但在注册表中找不到”而无法安装。 尝试将其安装到 Windows 7、64位计算机 问题答案: 对新观看者的警告:该答案已有好几年历史了(线索是它将Windows 7描述为“新”)。到现在(2014年),大多数Python库都应该支持64位。但是,如果仍然
我正在运行一个java RMI的Hello World示例 1)我在一个空文件夹中运行注册表 2)我启动HTTP服务器在运行时检索类。下载文件夹包含客户端-服务器的远程接口 3)我启动服务器,按照java RMI教程中的建议传递java.rmi.server.codebase属性 RMI注册表未联系HTTP服务器,正在引发异常(请参阅问题后的详细信息)。但是如果我做了下面的事情 1) 用java启
问题内容: 我在python中有一个 统一 的对象列表: 现在,我想提取一个具有该类某些属性的列表(比如attr),以便将其传递给某个函数(例如用于绘制该数据) pythonic的做法是什么, ? 也许派生列表并添加一个方法,所以我可以使用一些习惯用法,例如 ? 问题答案: 您还可以编写: 这样,您将获得一个节省内存的生成器。有关更多好处,请参见Generator Expressions 。
我现在正在学习lambda,我想知道如何用lambda用单行代码编写这段代码。