我正在制作一个简单的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
的{{1}}属性与QWizard.field
相结合来访问所有值。这似乎有点多余,因此没有必要。 Qt中是否有方法可以访问完整的字段集合? relevant section in the documentation没有提及任何内容,但是它遗漏了很多其他细节,所以这并不是很有说服力。< / p>
我的假设是PyQt4的功能(如果存在)与PyQt5相同。如果不是,我更喜欢PyQt5的答案,因为那是我目前正在使用的。
答案 0 :(得分:1)
你说如果答案是否定的,那就必须“非常有说服力”。您承认文档中没有提及您想要的功能,我将指出QWizard的公共功能列表中不会出现此类功能。因此,所需的功能(如果存在的话)是未记录的。对我来说,仅仅考虑这个问题将是一个“相当令人信服”的理由,不使用它。 Qt的下一个版本可能没有该功能,或者可能无法以相同的方式工作。
与此同时,你有一个可接受的解决方案,有八行直接的python代码。鉴于它之间的选择和调用未记录的函数(如果你能找到它),python解决方案在所有实际方面都非常优越。
但是,您的Python代码存在潜在问题。您重写函数QWizard.addPage
,但还有另一个函数QWizard.removePage
也应该被覆盖。我更喜欢的另一种方法是,不在QWizard
中存储field_names,而只在各个页面中存储。向QWizard添加一个方法,以动态构建一组所有当前field_names:
def all_field_names(self):
return {s for page_id in self.pageIds() for s in self.page(page_id).field_names}
[我没有很好的方法来测试这个功能,但我认为你明白了。]现在你删除被覆盖的方法QWizard.addPage
,从{{1删除变量field_names
},并删除QWizard
的中间两行。现在,您只有五行Python代码,无论页面的添加或删除方式如何,都可以使用。而且您不再将字段名称存储在两个位置。
值得一提的是,每当我遇到使用Qt功能或基本Python功能的选择时,我总是倾向于Python。我使用线程而不是QThreads,线程锁定和定时器而不是Qt等价物,Python方法对象和回调而不是自定义插槽和信号。 Qt是为C ++程序员编写的,这通常意味着它不像我想的那样“pythonic”。