1

シグナルをPyQt4のメソッドに接続するのに問題があります。オブジェクトAのバインドされたシグナルをオブジェクトBのメソッドに接続することはできますが、オブジェクトAのバインドされたシグナルを自己のメソッド(接続が行われるオブジェクト)に接続することはできません。
何が間違っていますか?下記参照:

from PyQt4.QtGui import *
from PyQt4.QtCore import *


class FooA(QObject):
    trigger=pyqtSignal(str)

    def receive_trigger(self,a):
        print'triggered in FooA, string',a

class MainObj(QObject):
    def __init__(self):
        self.a1=FooA()
        self.a2=FooA()
        #I can connect signals and methods of separate objects:
        self.a1.trigger.connect(self.a2.receive_trigger)
        self.a1.trigger.emit('hi')
        #... but I can't connect a signal with a method of self
        self.a1.trigger.connect(self.receive_trigger)
        self.a1.trigger.emit('hi')
    def receive_trigger(self,a):
        print 'triggered in MainObj'

MainObj()として実行されます

FooAでトリガー、文字列hi FooAでトリガー、文字列hi

>MainObjでトリガーされた追加の行が表示されることを期待していました

前もって感謝します。明細書

4

1 に答える 1

2

すでにご存知のように、シグナルはQObjectsに属している必要がありますが、この問題は、のコンストラクターを呼び出していないために発生していますQObjectFooAコンストラクターをオーバーライドしないため、デフォルトのコンストラクターが呼び出され、シグナルは期待どおりに機能します。ただしMainObj、スーパークラスの'()コンストラクターを呼び出さないQObjectため、シグナルは機能しません。修正するには、次のいずれかを入力します。

QObject.__init__(self)

また

super(QObject, self).__init__()

(あなたの慣習に基づいて)MainObjs contructorの上部にあり、信号は期待どおりに機能します。

于 2012-08-06T16:54:10.347 に答える