我创建了一个QMainWindow GUI,它使用单选按钮工具栏来选择主显示(即显示QStackedWidget的哪个小部件)。我终于得到了一个QButtonGroup的信号被检测到,但我不完全理解为什么我的修复工作。
这是一个最小的工作示例;重点是modelButtonGroup
方法。
class myGui(QMainWindow):
def __init__(self, parent=None):
super(myGui, self).__init__(parent)
self.setupCentral()
self.setupButtonToolBar()
def setupCentral(self):
self.stackedWidget = QStackedWidget()
self.setCentralWidget(self.stackedWidget)
windowA = QWidget()
windowALayout = QGridLayout()
windowALayout.addWidget(QLabel('Window A'))
windowB = QWidget()
windowBLayout = QGridLayout()
windowBLayout.addWidget(QLabel('Window B'))
windowA.setLayout(windowALayout)
windowB.setLayout(windowBLayout)
self.stackedWidget.addWidget(windowA)
self.stackedWidget.addWidget(windowB)
self.stackedWidget.setCurrentIndex(0)
def setupButtonToolBar(self):
buttonBar = QToolBar()
buttonBar.addWidget(self.modelButtonGroup())
self.addToolBar(buttonBar)
def modelButtonGroup(self):
modelsWidget = QWidget()
modelsLayout = QVBoxLayout()
self.ButtonGroup = QButtonGroup()
windowA_Button = QRadioButton('Window A')
windowA_Button.setChecked(True)
self.ButtonGroup.addButton(windowA_Button, 0)
windowB_Button = QRadioButton('Window B')
self.ButtonGroup.addButton(windowB_Button, 1)
self.ButtonGroup.buttonClicked[int].connect(self.switchdisplay)
modelsLayout.addWidget(windowA_Button)
modelsLayout.addWidget(windowB_Button)
modelsWidget.setLayout(modelsLayout)
return modelsWidget
def switchdisplay(self, id):
print('button %d has been pressed' % id)
self.stackedWidget.setCurrentIndex(id)
我的理解是,如果一个方法中的名称仅在该方法中引用,并且未在该类别的其他位置引用,则不需要self.
作为前缀。但是,如果使用ButtonGroup
代替self.ButtonGroup
,则.buttonClicked
信号不会被switchdisplay
处理。
在写这个问题时,我认为我确定了为什么会这样,但是会感谢您的确认。 modelButtonGroup
仅返回按钮小部件,仅在设置GUI时调用。 ButtonGroup
不会从函数中传出,而是被垃圾回收。自我。'即使它没有被名称直接引用,也需要使用前缀才能生效,
我是否正确理解了这一点?
答案 0 :(得分:2)
在阅读完代码后,我准备写一个解释问题的答案。但后来我继续读书,我发现你已经弄明白了:
ButtonGroup
未传递出函数,并被垃圾回收。自己。'它必须是“生存”的前缀,即使它没有直接通过名称引用。我是否正确理解了这一点?
是。这正是这里发生的事情。如果您没有保留对ButtonGroup
的引用,那么一旦它超出范围(在函数出口处),它就会被删除。它永远不会发出任何信号。
我认为@ eyllanesc的答案也可能有用。在这种情况下,对ButtonGroup
对象的引用将作为parent
类中的子项隐式保留。
FWIW,当我处理QMenu
个对象时,我通常会遇到这样的错误。
答案 1 :(得分:1)
ButtonGroup
必须是班级成员,如果您不想使用self.ButtonGroup
,则可以使用ButtonGroup = QButtonGroup(self)