PyQt:为什么方法中的QButtonGroup需要自我。'前缀信号按钮点击?

时间:2017-04-09 14:55:17

标签: python python-3.x pyqt 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)

我的理解是,如果一个方法中的名称仅在该方法中引用,并且未在该类别的其他位置引用,则不需要self.作为前缀。但是,如果使用ButtonGroup代替self.ButtonGroup,则.buttonClicked信号不会被switchdisplay处理。

在写这个问题时,我认为我确定了为什么会这样,但是会感谢您的确认。 modelButtonGroup仅返回按钮小部件,仅在设置GUI时调用。 ButtonGroup不会从函数中传出,而是被垃圾回收。自我。'即使它没有被名称直接引用,也需要使用前缀才能生效,

我是否正确理解了这一点?

2 个答案:

答案 0 :(得分:2)

在阅读完代码后,我准备写一个解释问题的答案。但后来我继续读书,我发现你已经弄明白了:

  

ButtonGroup未传递出函数,并被垃圾回收。自己。'它必须是“生存”的前缀,即使它没有直接通过名称引用。

     

我是否正确理解了这一点?

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

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

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

答案 1 :(得分:1)

ButtonGroup必须是班级成员,如果您不想使用self.ButtonGroup,则可以使用ButtonGroup = QButtonGroup(self)