我正在研究一个简单的QWizard
,它在其页面上显示一些单选按钮。给定页面上的按钮都是同一个QButtonGroup
的一部分。该页面注册为自己的自定义字段的基础上,按钮组中选择:PyQt获取QWizard中所有注册字段的集合
class Page1(QWizardPage):
selectionChanged = pyqtSignal('QString')
def __init__(self, name):
self.group = QButtonGroup()
self.group.addButton(QRadioButton("a"))
self.group.addButton(QRadioButton("b"))
self.group.addButton(QRadioButton("c"))
self.registerField(name, self, 'selection', self.selectionChanged)
@pyqtProperty('QString')
def selection(self):
checkedButton = self.group.checkedButton()
return checkedButton.text() if checkedButton else None
def nextId(self): return -1
我最终注册self
为包含字段属性,只是因为QButtonGroup
不是QWidget
小部件。所有其他页面看起来非常像这样(我实际上使用基类来完成所有常见工作,而这只是一个简单的例子)。
我希望能够获得QWizard
中所有注册字段的列表。我还没有发现Qt提供任何方法让我做到这一点,所以我通过覆盖每一页的registerField
方法的行为,以及向导的addPage
做了变通方法:
def registerField(self, name, *args, **kwargs):
self.field_names.add(name)
if self.wizard() is not None:
self.wizard().field_names.add(name)
super().registerField(name, *args, **kwargs)
def addPage(self, page, *args, **kwargs):
self.field_names.union(page.field_names)
return super().addPage(page, *args, **kwargs)
然后,我可以使用父QWizard
的field_set
属性与QWizard.field
结合来访问所有值。这似乎有点多余,因此是不必要的。 Qt中有一种方法可以访问完整的字段集合吗?relevant section in the documentation没有提及任何内容,但是有很多其他细节没有提及,所以这不是很明显。
我的假设是,如果存在的话,PyQt4的功能与PyQt5的相同。如果不是的话,我会更喜欢PyQt5的答案,因为那是我目前使用的。
非常有说服力,据我很担心。我绝对喜欢你的解决方案。我真正的代码覆盖了setPage,addPage和removePage,但这确实是一个巨大而几乎毫无意义的维护负担。通过向导执行此操作的唯一好处是,它可以正确地从不具有特殊属性的页面中注册字段。无论哪种方式,你都赢得了这个赏金。 –