gpt4 book ai didi

python - signal clicked 仅适用于静态方法

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:20 25 4
gpt4 key购买 nike

我正在使用 PyQt5,我正在尝试创建一个涉及 QPushButton 的应用程序。现在,当用户单击此按钮时,应该会执行一个函数。

当我尝试使用 button.clicked.connect(self.button_clicked_slot) 时,它仅按预期工作并且仅当 button_clicked_slot() 是静态方法时,即不'将 self 作为参数。如果它是非静态方法,则单击按钮时不会执行该函数。

我已经从 StackOver 和其他地方尝试过各种类似的答案,但没有一个能解决我面临的问题。我在一个类中创建和使用这个按钮,插槽函数是同一个类的一个方法。我试图让该类继承自 QWidget 和 QObject,但这些解决方案均无效。它似乎总是归结为使用静态方法。

整个代码会很大,但是,这里有一个完全相同的过度简化的代码片段

import sys
from PyQt5 import QtWidgets, QtCore

class activity(QtWidgets.QWidget):

def __init__(self):
app = QtWidgets.QApplication(sys.argv)

window = QtWidgets.QMainWindow()

button = QtWidgets.QPushButton('test button')
button.clicked.connect(self.temp_print)
window.setCentralWidget(button)

window.show()
sys.exit(app.exec_())

@staticmethod
def temp_print():
print('Reached here')

activity()

在上面的代码中,方法temp_print() 会在按钮被点击时执行(因为它是一个静态方法)。但是,如果我将函数重写为:

    def temp_print(self):
print('Reached here')

突然间,无论我点击按钮多少次,这个函数都不会执行。

在其他几个代码片段和官方文档中,我已经看到一个非静态函数被用作一个槽,而且事情似乎对他们来说进展顺利。我在上面分享的代码片段是我所面临问题的过度简化版本。

是的,在我上面分享的代码中,我不需要函数内的 self 参数,因此也应该能够使用静态方法。然而,就像我提到的,这是我使用的代码的简化版本(我的实际代码超过 500 行,因此将整个代码粘贴在这里是非常愚蠢的),但是,在我的实际代码中,我我正在使用 self 参数,因此需要一个非静态函数用作点击事件的插槽。

最佳答案

与需要创建对象的类方法不同,无需实例即可调用静态方法。

在您的示例中,app.exec_() 阻止构造函数运行,因此无法调用该类的其他方法,例如 temp_print

所以有两种可能的解决方案:

  • 使用 lambda 方法调用 temp_print:
import sys
from PyQt5 import QtWidgets


class Activity:
def __init__(self):
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QMainWindow()

button = QtWidgets.QPushButton("test button")
button.clicked.connect(lambda: self.temp_print())
window.setCentralWidget(button)
window.show()
sys.exit(app.exec_())

def temp_print(self):
print("Reached here")


if __name__ == "__main__":
Activity()
  • 让对象完成构建:
import sys
from PyQt5 import QtWidgets


class Activity:
def __init__(self):
self.m_app = QtWidgets.QApplication(sys.argv)
self.window = QtWidgets.QMainWindow()

button = QtWidgets.QPushButton("test button")
button.clicked.connect(self.temp_print)
self.window.setCentralWidget(button)
self.window.show()

def temp_print(self):
print("Reached here")

def run(self):
return self.m_app.exec_()


if __name__ == "__main__":
a = Activity()
sys.exit(a.run())

关于python - signal clicked 仅适用于静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57145322/

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