PySide Qt self.function 在 clicked.connect() 中不工作

PySide Qt self.function not working in clicked.connect()

我只是想在单击按钮时 运行 一个 class 函数。当你这样写时它会起作用(在 class 之外):

from PySide2 import QtWidgets
window =  QtWidgets.QWidget()

def click_me(self):
    print('clicked me!')

button1 = QtWidgets.QPushButton("Click me")
button1.clicked.connect(click_me)

layout = QtWidgets.QVBoxLayout()
layout.addWidget(button1)

window.setLayout(layout)
window.show()

但出于某种原因,在 class:

中同样的事情不起作用
from PySide2 import QtWidgets
window =  QtWidgets.QWidget()

class Tester():
    def click_me(self):
        print('clicked me!')

    def run(self):
        button1 = QtWidgets.QPushButton("Click me")
        button1.clicked.connect(self.click_me)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(button1)

        window.setLayout(layout)
        window.show()

Tester().run()

有人可以帮我理解为什么会这样以及我该如何解决它。我需要 class 方法,所以我不能像第一个例子那样去掉 class。

注意:我在 Autodesk Maya 中 运行 进行此操作,因此在我的情况下,我不需要在我的代码中启动 QApplication。我通过简单地将上面的代码粘贴到 Maya 终端并 运行ning 它来执行上面的代码。

原因很简单:该实例没有持久引用,即使在本地范围内也是如此,因此它一创建就被删除,其 run 方法 returns.

解决方法也很简单,只需要修改最后一行:

tester = Tester()
tester.run()

这确保实例具有持久性(将其设置为变量会创建引用),因此它不会收集垃圾(又名:删除)。在您的情况下,该实例实际上在该行之后被删除,因此 click_me 函数(这是一个 instance 属性)也被删除,因此信号自动断开因为该对象不再存在。

我相信您对许多教程只是调用一个 main 函数或在您尝试时直接在一行中创建实例这一事实感到困惑。

区别在于那些教程创建 windows 使用 maya main window 作为父级(这意味着它有一个引用),在那种情况下 Python 删除它们。

在您的第一个示例中,问题没有发生,因为 click_me 函数是匿名的,并且在环境的本地范围内被引用。