PyQt获取QWizard中所有注册字段的集合

时间:2017-04-07 16:06:18

标签: python pyqt qwizard

我正在制作一个简单的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的答案,因为那是我目前正在使用的。

1 个答案:

答案 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”。