PyQt:为什么方法中的 QButtonGroup 需要“self”。信号 buttonClicked 的前缀?

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没有传递出的功能,并回收垃圾。自己。' 前缀是它“生存”所必需的,即使它没有直接按名称引用。

我理解正确吗?

Stu*_*erg 5

阅读您的代码后,我准备写一个解释问题的答案。但后来我继续阅读,我看到你已经自己弄明白了:

ButtonGroup没有传递出的功能,并回收垃圾。自己。' 前缀是它“生存”所必需的,即使它没有直接按名称引用。

我理解正确吗?

是的。这正是这里发生的事情。如果您不保留对 的引用ButtonGroup,则一旦超出范围(在函数退出时),它就会被删除。它永远不会发出任何信号。

我认为@eyllanesc 的答案也可能有效。在这种情况下,对ButtonGroup对象的引用将被隐式保留,作为parent类中的子对象。

FWIW,当我处理QMenu对象时,我通常会遇到这样的错误。