SIGNAL问题 - SLOT,aboutToQuit()

ath*_*spk 2 python qt pyqt python-3.x

我的应用程序只能通过右键单击托盘图标并按"退出"退出:

class DialogUIAg(QDialog):
    ...
    self.quitAction = QAction("&Quit", self, triggered=qApp.quit)
Run Code Online (Sandbox Code Playgroud)

下面的模块是应用程序的起点:

#!/usr/bin/env python

import imgAg_rc
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import appLogger

from runUIAg import *

class Klose:
    """ Not sure if i need a Class for it to work"""
    def closingStuff(self):
        print("bye")

@pyqtSlot()
def noClassMethod():
    print("bye-bye")

app = QApplication(sys.argv)
QApplication.setQuitOnLastWindowClosed(False)

k = Klose()
app.connect(app, SIGNAL("aboutToQuit()"), k,SLOT("closingStuff()")) #ERROR

app.connect(app, SIGNAL("aboutToQuit()"), k.closingStuff)   # Old-Style
app.connect(app, SIGNAL("aboutToQuit()"), noClassMethod)    # Old-Style

app.aboutToQuit.connect(k.closingStuff)   # New-Style
app.aboutToQuit.connect(noClassMethod)    # New-Style

winUIAg = DialogUIAg()
winUIAg.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)

我的意图是当应用程序是关于ToQuit时执行一段代码.
这是我得到的错误:

$ ./rsAg.py
Traceback (most recent call last):
  File "./rsAgent.py", line 20, in <module>
    app.connect(app, SIGNAL("aboutToQuit()"), k,SLOT("closingStuff()"))
TypeError: arguments did not match any overloaded call:
  QObject.connect(QObject, SIGNAL(), QObject, SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'Klose'
  QObject.connect(QObject, SIGNAL(), callable, Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'Klose'
  QObject.connect(QObject, SIGNAL(), SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'Klose'
Run Code Online (Sandbox Code Playgroud)

我是python和Qt的新手,我很感激你的帮助.


编辑:

  • 我忘了提及版本(python:3.2,pyQt:4.8.4)
  • 我们不需要一个类来定义Slot.通过使用@pyqtSlot()装饰器,任何方法都可以是Slot .
  • 我在代码中添加了noClassMethod().
  • @Mat,你的建议帮助我走得更远.现在我发现了其他三种方法.我想它是关于旧式和新式的.
  • 对于未来可能的读者,我不会删除错误消息.

谢谢大家 :-)

Mat*_*Mat 5

PyQt信号/槽语法与C++语法不完全相同.

试试:

class Klose:
  def closingStuff(self):
    print("bye")

...
app.connect(app, SIGNAL("aboutToQuit()"), k.closingStuff)
Run Code Online (Sandbox Code Playgroud)

不确定在PyQt中是否有必要,但通常预期信号和插槽来自/去往QObjects.如果您的PyQt版本足够新,那么新型信号和插槽可能会引起关注.

  • 在PyQt中,槽可以是python函数(类不是必需的).文档:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/old_style_signals_slots.html#connecting-signals-and-slots (2认同)