我正在PySide中构建一个QWidget,并在尝试在页面之间共享数据时遇到问题。
总结一下,我利用先前页面中的用户输入来构建自定义对象列表,我需要与以下页面共享。
在我的代码的开头,我构建了一个自定义对象,其中包含一个名为 .name
的属性(以及其他属性)
class MyCustomClass():
def __init__(self, name, other_attributes)
self.name = name
...set other attributes
在我的QWizard中,我打开一个文件,并创建一个名称列表,以与另一个MyCustomClass
对象列表匹配。然后,我会在相应的name
对象的匹配MyCustomClass
旁边显示名称,并提示用户确认(或更改),然后再转到下一页。
每个匹配都存储为tuple(name, MyCustomClass)
并添加到列表中。然后,我希望从下一页读取此列表,以执行更多操作。我尝试使用 .registerField
,但我不确定如何正确使用 QWizardPage
。我的尝试如下。
首先,我创建一个 .registerField
,执行一些代码,然后构建我的匹配项。我创建了一个函数来返回值并将其用于class ConfirmMatches(QWizardPage):
def __init__(self):
...
def initializePage(self):
# Code to make display and operations and make list of matches
...
self.matches = matches
self.registerField("matches", self, "get_matches")
def get_matches(self):
return self.matches
None
然后从我的下一页开始,我尝试调用该字段,但我只返回一个class NextPage(QWizardPage):
def __init__(self):
...
def initializePage(self):
# Get relevant fields from past pages
past_matches = self.field("matches")
对象。
type(past_matches)
None
为print self.matches
,即使我在上一页的registerField
内清楚地显示了所有内容。
我对{{1}}做错了什么?
是否有更简单的方式在页面之间共享此类数据?
答案 0 :(得分:2)
我实际上是自己解决了这个问题。我走在正确的轨道上,只是遗漏了一些东西,但我会在这里为其他有类似问题的人编目。
就像我说的,我有一个匹配对象列表,其中每个匹配是一个名称列表,以及找到与该名称对应的对象,即match = [name, MyCustomClass]
class ConfirmMatches(QWizardPage):
# Function to change list
def setList(self, new_list):
self.list_val = new_list
if self.list_val != []:
self.list_changed.emit()
# Function to return list
def readList(self):
return self.list_val
def __init__(self):
self.list_val = [] # Create initial value
# Code to initialize displays/buttons, and generate matches
...
# Here I assign the matches I made "matches", to the QProperty "match_list"
self.setList(matches)
# Then register field here.
# Instead of the read function, I call the object itself (not sure why, but it works)
self.registerField("registered_list", self, "match_list")
# Define "match_list" as a QProperty with read and write functions, and a signal (not used)
match_list = Property(list, readList, setList)
listChanged = Signal()
我将列表设为QProperty,并编写了Read和Write函数,以及Signal(未使用)。然后,当注册字段时,我放置了QProperty本身(match_list),而不是放入Read函数(readList)。不知道它为什么会起作用,但可以想象这可以用来注册其他自定义对象。
答案 1 :(得分:0)
如果您想在matches
页面中明确设置字段ConfirmMatches
的值,则需要执行以下操作之一:
QLineEdit
,并在registerField
调用中使用该小部件。如果您检查QWizardPage.registerField
的文档,它的作用是在发出小部件的信号时注册以获取传入的小部件的命名属性。您的代码现在的方式,您需要在ConfirmMatches
页面添加一个信号,当您的匹配变量发生变化时,该信号将被发出。否则,您的页面不知道该字段何时应该更新。