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

Posted

技术标签:

【中文标题】PySide Qt self.function 在 clicked.connect() 中不起作用【英文标题】:PySide Qt self.function not working in clicked.connect() 【发布时间】:2021-01-07 10:22:27 【问题描述】:

当我的按钮被点击时,我只是想运行一个类函数。当您像这样(在课堂之外)编写它时它可以工作:

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()

但由于某种原因,在类中时同样的事情不起作用:

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()

有人可以帮我理解为什么会出现这种情况以及如何解决它。我需要类方法,所以我不能像我的第一个示例那样摆脱类。

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

【问题讨论】:

在这两种情况下,您似乎都缺少 QApplication 的创建(和执行)。请确保您的示例是可重现的。 我在 Maya 中使用它,我不需要添加这样的东西。我不确定你指的是什么?如果你想添加它,你可以编辑我的问题。 好的,下次考虑指定它,因为它不是暗示的:对于独立的 (Py)Qt 程序,QApplication 是强制性的,这会使您的代码无法工作; Maya 已经创建了一个 QApplication 实例,所以它不是必需的(但我们必须知道这一点)。也就是说,您的第一个代码是否完整?事实是,即使假设上述情况,您的第一个 sn-p 也不会工作:它将运行,窗口将被显示,然后立即关闭并删除,因为没有保持它活着的参考。 好的,感谢您提供的信息,我会将其添加到我的问题中。是的,它确实 100% 有效,我现在也对其进行了测试以确保。它会创建一个包含按钮的窗口,您可以单击该按钮并在控制台中查看打印语句。 据我所知,应该加载的所有内容都必须以某种方式添加到userSetup.py,对吗?您是如何添加上述脚本的? 【参考方案1】:

原因很简单:实例没有持久引用,即使在本地范围内也是如此,因此它在创建后立即被删除,并且其 run 方法返回。

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

tester = Tester()
tester.run()

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

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

不同之处在于,这些教程创建的窗口使用 Maya 主窗口作为父窗口(这意味着它有一个引用),在这种情况下,Python 不会删除它们。

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

【讨论】:

以上是关于PySide Qt self.function 在 clicked.connect() 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Qt - Pyside - .saveGeom() .saveState() (再次)

使用 PySide2 在 Qt-Designer 中嵌入 PyQtGraph

PySide2(Qt for Python)在 Linux 上的 Qt Designer 安装在哪里?

Qt和PyQt和PySide之间的关系

PySide / PyQtGraph 访问主 Qt 事件线程

模型中 dropActions 的访问值 (PySide/PyQt/Qt)