2011-06-29 11 views
2

私のアプリケーションが終了するだけで右クリックしてトレイアイコンを、そして「終了」を押すことによって:以下問題 - SLOT、aboutToQuit()

class DialogUIAg(QDialog): 
    ... 
    self.quitAction = QAction("&Quit", self, triggered=qApp.quit) 

モジュールは、アプリケーションの出発点である:

#!/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_() 

私の意図は、アプリケーションがaboutToQuitであるときに、コードのブロックを実行することです。
これは私が取得していますエラーです:

$ ./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' 

私は、PythonとQtに新しいですし、私はあなたの助けをいただければ幸いです。


EDIT:私たちは、スロットを定義するクラスを必要といけない

  • 私はバージョン(4.8.4:3.2、PyQtはパイソン)を言及するのを忘れてしまった

    • 。任意の方法は、@pyqtSlot()デコレータを使用して、Slotにすることができます。
    • コードにnoClassMethod()を追加しました。
    • @Mat、あなたの提案は私がさらに助けになりました。今私はそれをやっている3つの方法を見つけた。私は約旧スタイル対新しいスタイルを推測する。
    • 将来の可能性のある読者のために、エラーメッセージは削除しません。

    PyQtは信号/スロット構文はC++ものと全く同じではありません

  • 答えて

    5

    :-)みんなに感謝します。

    で試してみてください:

    class Klose: 
        def closingStuff(self): 
        print("bye") 
    
    ... 
    app.connect(app, SIGNAL("aboutToQuit()"), k.closingStuff) 
    

    ないことがPyQtは必要であるが、シグナルとスロットは一般のQObjectに行く/から来ることが予想されていることを確認。 New-style signals and slotsはPyQtのバージョンが最新のものであれば興味があります。 PyQt5、新しい形式の信号で

    +2

    、スロットは、Python関数(クラスは必要ではない)とすることができます。ドキュメント:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/old_style_signals_slots.html#connecting-signals-and-slots – pedrotech

    0

    :PyQtはでapp.aboutToQuit.connect(...)

    def app_aboutToQuit(): 
        print('app_aboutToQuit()') 
    
    app = QtWidgets.QApplication(sys.argv) 
    app.aboutToQuit.connect(app_aboutToQuit) 
    
    +0

    これはPyQt4でも有効です。たとえば、 'app = QtGui.QApplication.instance( ); app.aboutToQuit.connect(app_aboutToQuit) ' – dbr