【问题标题】:PyQt: Why does a QButtonGroup in a method need 'self.' prefix to signal buttonClicked?PyQt:为什么方法中的 QButtonGroup 需要“自我”。信号按钮单击的前缀?
【发布时间】:2017-09-04 14:43:27
【问题描述】:

我创建了一个 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,则switchdisplay 不会处理其.buttonClicked 信号。

在写这个问题时,我认为我确定了这是为什么,但希望得到确认。 modelButtonGroup 仅返回按钮小部件,并且仅在设置 GUI 时调用。 ButtonGroup 没有从函数中传递出去,而是被垃圾回收了。自己。'它需要前缀才能“继续存在”,即使它没有直接通过名称引用。

我理解正确吗?

【问题讨论】:

  • ButtonGroup必须是类的成员,如果不想使用self.ButtonGroup,可以使用ButtonGroup = QButtonGroup(self)
  • 这是一个通用的 Python 特性/效果,不是吗?

标签: python python-3.x pyqt pyqt5


【解决方案1】:

我看你自己已经想通了:

ButtonGroup 没有从函数中传递出去,而是被垃圾回收了。自己。'它需要前缀才能“继续存在”,即使它没有直接通过名称引用。

我理解正确吗?

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

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

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

【讨论】:

    【解决方案2】:

    ButtonGroup必须是类的成员,如果不想使用self.ButtonGroup,可以使用ButtonGroup = QButtonGroup(self)

    【讨论】:

      猜你喜欢
      • 2017-01-23
      • 1970-01-01
      • 2013-07-07
      • 2018-02-01
      • 2013-05-14
      • 1970-01-01
      • 2019-05-30
      • 2015-10-27
      • 2018-05-19
      相关资源
      最近更新 更多