我正在开发一个简单的^{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
的行为来解决这个问题:
def addPage(self, page, *args, **kwargs):
self.field_names.union(page.field_names)
return super().addPage(page, *args, **kwargs)
然后我可以使用父对象QWizard
的field_set
属性与^{
我的假设是,如果PyQt4的功能与PyQt5的功能相同。如果不是的话,我更喜欢PyQt5的答案,因为这正是我目前使用的。在
你说如果答案是否定的,那就必须“相当有说服力”。你承认文档中没有提到你想要的功能,我要指出的是,在QWizard的公共函数列表中没有这样的函数。因此,所需的函数(如果存在)是未记录的。对我来说,光是考虑这个因素就可以成为不使用它的“相当令人信服”的理由。Qt的下一个版本可能没有这个功能,或者它的工作方式可能不同。在
同时,您有一个可接受的解决方案,其中包含八行简单的python代码。如果您可以在这和调用未记录的函数(如果可以找到的话)之间进行选择,python解决方案在所有实际方面都非常优越。在
但是,您的Python代码有一个潜在的问题。您重写了函数
QWizard.addPage
,但是还有另一个函数QWizard.removePage
也应该被重写。另一种方法,我更倾向于,根本不将字段名存储在QWizard
中,而只存储在各个页面中。向QWizard添加一个方法,以动态生成所有当前字段名的集合:[我没有一个好的方法来测试这个函数,但是我想您已经明白了这个想法。]现在您删除了被重写的方法},并删除{}的中间两行。现在您只有五行Python代码,不管如何添加或删除页面,这些代码都可以工作。并且不再将字段名存储在两个位置。在
QWizard.addPage
,从QWizard
中删除变量{无论何时,当我使用Python的基本功能时,我总是选择使用Python的基本功能。我使用线程而不是QThreads、线程锁和计时器而不是Qt等价物、Python方法对象和回调而不是定制的槽和信号。Qt是为C++程序员编写的,这通常意味着它不是我所希望的“Pythic”。在
相关问题 更多 >
编程相关推荐