在Pyside / PyQt中的QWizard页面之间共享变量

时间:2014-08-30 21:20:12

标签: python-3.x pyqt pyside

我正在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)

Noneprint self.matches,即使我在上一页的registerField内清楚地显示了所有内容。

  1. 我对{{1}}做错了什么?

  2. 是否有更简单的方式在页面之间共享此类数据?

2 个答案:

答案 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的值,则需要执行以下操作之一:

  1. 每次匹配更改时,都会显式调用self.setField。
  2. 每次注册属性后更改匹配项时发出信号
  3. 将您的匹配项存储在标准Qt输入之一,例如QLineEdit,并在registerField调用中使用该小部件。
  4. 如果您检查QWizardPage.registerField的文档,它的作用是在发出小部件的信号时注册以获取传入的小部件的命名属性。您的代码现在的方式,您需要在ConfirmMatches页面添加一个信号,当您的匹配变量发生变化时,该信号将被发出。否则,您的页面不知道该字段何时应该更新。