gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:49:38 54 4
gpt4 key购买 nike

我创建了一个 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/

54 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com