我创建了一个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
未传递出函数并被垃圾回收。即使它没有直接按名称引用,也需要使用'self.'前缀才能“存活下来”。
我的理解正确吗?
ButtonGroup
must be a member of the class, if you do not want to useself.ButtonGroup
, you can useButtonGroup = QButtonGroup(self)
- eyllanesc