【发布时间】:2017-09-04 14:43:27
【问题描述】:
我创建了一个 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,则switchdisplay 不会处理其.buttonClicked 信号。
在写这个问题时,我认为我确定了这是为什么,但希望得到确认。 modelButtonGroup 仅返回按钮小部件,并且仅在设置 GUI 时调用。 ButtonGroup 没有从函数中传递出去,而是被垃圾回收了。自己。'它需要前缀才能“继续存在”,即使它没有直接通过名称引用。
我理解正确吗?
【问题讨论】:
-
ButtonGroup必须是类的成员,如果不想使用self.ButtonGroup,可以使用ButtonGroup = QButtonGroup(self) -
这是一个通用的 Python 特性/效果,不是吗?
标签: python python-3.x pyqt pyqt5