1

我正在研究一个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 的答案,因为这是我目前正在使用的。

4

1 回答 1

2

你说如果答案是否定的,那它必须“非常有说服力”。您承认文档中没有提及您想要的功能,我会指出 QWizard 的公共功能列表中没有出现此类功能。因此,所需的功能(如果存在)是未记录的。对我来说,仅考虑这一点就是不使用它的“非常有说服力”的理由。Qt 的下一个版本可能没有这个功能,或者它可能不会以同样的方式工作。

同时,您有一个可接受的解决方案,包含八行简单的 Python 代码。考虑到在调用一个未记录的函数(如果你能找到它)之间进行选择,python 解决方案在所有实际方面都非常优越。

但是,您的 Python 代码存在潜在问题。您覆盖了 function QWizard.addPage,但还有另一个函数QWizard.removePage可能也应该被覆盖。我更喜欢的另一种方法是根本不存储 field_names,QWizard而只存储在各个页面中。向 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中删除变量,并删除中间两行. 现在您只有五行 Python 代码,无论页面如何添加或删除,它们都可以正常工作。而且您不再将字段名称存储在两个地方。field_namesQWizardregister_field

对于它的价值,每当我在使用 Qt 的功能或基本的 Python 功能之间做出选择时,我总是倾向于 Python。我使用线程而不是 QThreads,线程锁和计时器而不是 Qt 等效项,Python 方法对象和回调而不是自定义插槽和信号。Qt 是为 C++ 程序员编写的,这通常意味着它不像我想要的那样“pythonic”。

于 2017-04-13T00:25:10.867 回答