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

2024-09-29 21:23:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个简单的^{},它在页面上显示一些单选按钮。给定页面上的按钮都是相同的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注册为包含field属性的小部件,因为QButtonGroup不是QWidget。所有其他页面看起来都很像这样(实际上,我使用基类来完成所有常见的工作,这只是一个最小的示例)。在

我希望能够得到QWizard中所有注册字段的列表。我没有找到Qt提供的任何方法来允许我这样做,所以我通过重写每个页面的registerField方法以及向导的addPage的行为来解决这个问题:

^{pr2}$

def addPage(self, page, *args, **kwargs):
    self.field_names.union(page.field_names)
    return super().addPage(page, *args, **kwargs)

然后我可以使用父对象QWizardfield_set属性与^{}结合使用来访问所有值。这似乎有点多余,因此没有必要。Qt中是否有方法访问完整的字段集合?relevant section in the documentation没有提到任何内容,但是它忽略了很多其他细节,因此这不是很好的说明问题。在

我的假设是,如果PyQt4的功能与PyQt5的功能相同。如果不是的话,我更喜欢PyQt5的答案,因为这正是我目前使用的。在


Tags: 方法selffieldreturndefpagegroup页面
1条回答
网友
1楼 · 发布于 2024-09-29 21:23:02

你说如果答案是否定的,那就必须“相当有说服力”。你承认文档中没有提到你想要的功能,我要指出的是,在QWizard的公共函数列表中没有这样的函数。因此,所需的函数(如果存在)是未记录的。对我来说,光是考虑这个因素就可以成为不使用它的“相当令人信服”的理由。Qt的下一个版本可能没有这个功能,或者它的工作方式可能不同。在

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

但是,您的Python代码有一个潜在的问题。您重写了函数QWizard.addPage,但是还有另一个函数QWizard.removePage也应该被重写。另一种方法,我更倾向于,根本不将字段名存储在QWizard中,而只存储在各个页面中。向QWizard添加一个方法,以动态生成所有当前字段名的集合:

def all_field_names(self):
    return {s for page_id in self.pageIds() for s in self.page(page_id).field_names}

[我没有一个好的方法来测试这个函数,但是我想您已经明白了这个想法。]现在您删除了被重写的方法QWizard.addPage,从QWizard中删除变量{},并删除{}的中间两行。现在您只有五行Python代码,不管如何添加或删除页面,这些代码都可以工作。并且不再将字段名存储在两个位置。在

无论何时,当我使用Python的基本功能时,我总是选择使用Python的基本功能。我使用线程而不是QThreads、线程锁和计时器而不是Qt等价物、Python方法对象和回调而不是定制的槽和信号。Qt是为C++程序员编写的,这通常意味着它不是我所希望的“Pythic”。在

相关问题 更多 >

    热门问题