0

独自のカスタムシグナルを作成しようとしていますが、何らかの理由で関数に組み込まれていません。私が間違ったアイデアはありますか?

def __init__(self):
    ...
    self.connect( self, QtCore.SIGNAL( 'dagEvent(type, *args)' ), self.OnDagEvent)

def someFunc(self, ...):
    ...
    self.emit(QtCore.SIGNAL('dagEvent()'), type, *args)

def OnDagEvent( self, eventType, eventData ):
    print 'Test'
4

1 に答える 1

0

問題は、カスタム信号の署名を作成する方法にあります。あなたがそれをすることを許されるいくつかの方法があります、しかしあなたが今それを持っている方法はそれらの1つではありません。

接続を定義するとき、それを行う方法によってエラーが発生するはずです。

# not a valid type of signature
QtCore.SIGNAL( 'dagEvent(type, *args)' )

そして、それが作成されることを許可されたとしても、後で発行するときは、とにかく同じ署名を参照していません。

# if it were even allowed, would have to be: dagEvent(type, *args)
self.emit(QtCore.SIGNAL('dagEvent()'), type, *args)

古いスタイルの信号とスロットのサポート

PyQtからカスタムシグナルを作成する最も簡単な方法は、呼び出し可能な名前のみを使用することです。

self.connect(self, QtCore.SIGNAL('dagEvent'), self.OnDagEvent)
...
# "type" is a builtin. I renamed it to type_
self.emit(QtCore.SIGNAL('dagEvent'), type_, *args)

このアプローチでは、渡すことにした引数は関係ありません。あなたはあなたが望むものは何でも渡すことができます。

シグニチャを具体的に制御する場合は、組み込みタイプを定義できます。

self.connect(self, QtCore.SIGNAL('dagEvent(int,str,int)'), self.OnDagEvent)
...
self.emit(QtCore.SIGNAL('dagEvent(int,str,int)'), i1, s2, i3)

放出で正しい署名を使用しなかった場合、それは呼び出されず、放出時に間違ったタイプを渡すとエラーが発生します。

ここで、署名をある程度定義したいが、それを基本タイプに限定せず、Pythonオブジェクトを許可したい場合は、次のようにすることができます。

self.connect(self, QtCore.SIGNAL('dagEvent(PyQt_PyObject)'), self.OnDagEvent)
...
self.emit(QtCore.SIGNAL('dagEvent(PyQt_PyObject)'), foo)

これにより、任意の1つのPythonオブジェクトを渡すことができますが、具体的には1つの引数が必要であると述べています。

于 2012-06-27T17:50:43.013 に答える