python - PyQt:为什么方法中的 QButtonGroup 需要 'self.' 前缀来发出按钮单击信号?

标签 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 不会从函数中传递出去,并且会被垃圾回收。自己。'即使没有直接通过名称引用,它也需要前缀才能“继续存在”。

我的理解正确吗?

最佳答案

我发现您已经自己弄清楚了:

The ButtonGroup is not passed out of the function, and is garbage collected. The 'self.' prefix is required for it to 'live on', even if it's not directly referred to by name.

Am I understanding this correctly?

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

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

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

关于python - PyQt:为什么方法中的 QButtonGroup 需要 'self.' 前缀来发出按钮单击信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43308196/

相关文章:

python - 如何使 QIcon 可点击?

python - 在python中搜索文档中的关键字

python - 从多个列表中获取特定的字典属性值

python-3.x - Python - KeyError(key) 被引发,但它不应该

python - 使用 QSqlTableModel 的 QListView 中的复选框

python - PyQt:动态添加qpushbutton

python - 线性插值。如何在 C 中实现此算法? (给出Python版本)

python - 检测音频文件中的声音边界

python - 迭代行 if 语句并添加到新列 [Pandas/Python]

python - 如何仅绘制具有数组某些值的某些单元格,而其他单元格则不使用 matplotlib.pyplot?