我正在研究一个QWizard在其页面上显示一些单选按钮的简单程序。给定页面上的按钮都是相同的一部分QButtonGroup。根据按钮组中的选择,页面本身注册为自定义字段:
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)
然后我可以结合使用field_set父级的属性来访问所有值。这似乎有点多余,因此没有必要。Qt 中是否有访问完整字段集合的方法?文档中的相关部分没有提及任何内容,但它省略了很多其他细节,所以这不是很能说明问题。QWizardQWizard.field
我的假设是 PyQt4 的功能(如果存在)与 PyQt5 的功能相同。如果不是,我更喜欢 PyQt5 的答案,因为这是我目前正在使用的。