我正在研究一個簡單的QWizard
,它在其頁面上顯示一些單選按鈕。給定頁面上的按鈕都是同一個QButtonGroup
的一部分。該頁面註冊爲自己的自定義字段的基礎上,按鈕組中選擇:PyQt獲取QWizard中所有註冊字段的集合
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)
然後,我可以使用父QWizard
的field_set
屬性與QWizard.field
結合來訪問所有值。這似乎有點多餘,因此是不必要的。 Qt中有一種方法可以訪問完整的字段集合嗎?relevant section in the documentation沒有提及任何內容,但是有很多其他細節沒有提及,所以這不是很明顯。
我的假設是,如果存在的話,PyQt4的功能與PyQt5的相同。如果不是的話,我會更喜歡PyQt5的答案,因爲那是我目前使用的。
非常有說服力,據我很擔心。我絕對喜歡你的解決方案。我真正的代碼覆蓋了setPage,addPage和removePage,但這確實是一個巨大而幾乎毫無意義的維護負擔。通過嚮導執行此操作的唯一好處是,它可以正確地從不具有特殊屬性的頁面中註冊字段。無論哪種方式,你都贏得了這個賞金。 –