Geo*_*etz 5 python pyqt python-3.x pyqt5
我创建了一个 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)
Run Code Online (Sandbox Code Playgroud)
我的理解是,如果一个方法中的名称仅在该方法中被引用,而在类中的其他地方没有被引用,则self.不需要作为前缀。但是,如果ButtonGroup使用 代替self.ButtonGroup,则其.buttonClicked信号不会被 处理switchdisplay。
在写这个问题时,我想我确定了为什么会这样,但希望得到确认。modelButtonGroup仅返回按钮小部件,并且仅在设置 GUI 时调用。在ButtonGroup没有传递出的功能,并回收垃圾。自己。' 前缀是它“生存”所必需的,即使它没有直接按名称引用。
我理解正确吗?
阅读您的代码后,我准备写一个解释问题的答案。但后来我继续阅读,我看到你已经自己弄明白了:
在
ButtonGroup没有传递出的功能,并回收垃圾。自己。' 前缀是它“生存”所必需的,即使它没有直接按名称引用。我理解正确吗?
是的。这正是这里发生的事情。如果您不保留对 的引用ButtonGroup,则一旦超出范围(在函数退出时),它就会被删除。它永远不会发出任何信号。
我认为@eyllanesc 的答案也可能有效。在这种情况下,对ButtonGroup对象的引用将被隐式保留,作为parent类中的子对象。
FWIW,当我处理QMenu对象时,我通常会遇到这样的错误。
| 归档时间: |
|
| 查看次数: |
890 次 |
| 最近记录: |