2016-04-07 4 views
-1

信号とスロットの間に簡単な接続を作成しようとしていますが、余分な機能を呼び出そうとしています。私が来た2つの選択肢があります。私のクラスを呼び出すコードは次のとおりです。PyQt5は信号をログに書きます

(オプション1)

self.flip = MyClass("Flip Image") 
self.flip.clicked.connect(self.do_flip) 

QWidgetは、その後、その主要な目的は作られた信号を記録することである私のクラスでインスタンス化されます。

class MyClass(QPushButton): 

    def __init__(self, name: str) -> None: 
     super().__init__(name) 
     self._name = name 

    def mousePressEvent(self, *args, **kwargs): 
     self.log_info() 

    def log_info(self): 
     log(self._name) 

はなぜdo_flipスロットは何を私は理解していないと呼ばれることはありませんされていますか?これは私が私のクラスが実装しなければならないと考えている方法ですか。これは私には意味がありませんので、私が代わりに

(オプション2)を介してクリックされた信号を上書きしようとした

class MyClass(QPushButton): 

    def __init__(self, name: str) -> None: 
     super().__init__(name) 
     self._name = name 

    def clicked(self, *args, **kwargs): 
     self.log_info() 
     #add connect() here? 

    def log_info(self): 
     log(self._name) 

をしかし、このコードで私はフレンドリーAttributeError: 'function' object has no attribute 'connect'を取得します。私はclickedメソッドとそれがどのように接続するかについてのドキュメントを見つけることができません。スロットにクリックして接続する方法がありますか、それとも自分の信号を作成する必要がありますか?私はこれも、特定の値を放出する他のシグナルを無効にしようとするときに非常に役立つことがわかります。

ので、これはに私をリードした場合:

ラストリゾート - 私自身のシグナル

クラスは、このように呼ばれることになります。

self.flip = MyClass("Flip Image") 
self.flip.mysig.connect(self.do_flip) 

そして、このように実装:

これは機能します。しかし、私の実装が理にかなっているかどうかはわかりません。それはハッキーのような感じです。私はこの最後のリゾートオプションを使用しないことを好むだろうし、私は清潔なオプションがあることを望んでいる。

答えて

1

1オプションでは、superを使用して、デフォルトの実装を呼び出すことなくQPushButtonmousePressEventメソッドをオーバーライドしている、と私は信じてこれはclicked信号が放出されることはありません理由です。例えば:

class MyClass(QPushButton): 

def __init__(self, name: str) -> None: 
    super().__init__(name) 
    self._name = name 

def mousePressEvent(self, event): 
    self.log_info() 
    super().mousePressEvent(event) 

def log_info(self): 
    log(self._name) 

2オプションであなたの代わりに、それはpyqtSignal()する必要がありながら、呼び出し可能な通常のpythonとしてclickedを宣言しています。また、これは絶対に行く方法ではありません。

あなたが必要なものを達成するための正しい方法は、同じ信号のための複数のスロットを使用することで、すなわち:オプション2では

class MyClass(QPushButton): 

    def __init__(self, name: str) -> None: 
     super().__init__(name) 
     self._name = name 

    @pyqtSlot() 
    def log_info(self): 
     log(self._name) 

self.flip = MyClass("Flip Image") 
self.flip.clicked.connect(self.do_flip) 
self.flip.clicked.connect(self.flip.log_info) 
+0

、QAbstractButton' ''で与えclicked' pyqtSignalを無効にする方法がありますログへの呼び出しを追加するには? – Max

+0

'clicked'は関数ではありませんが、pyqtSignalです。私が記事で説明したように、確かに行く方法ではありません。 –

+0

私はちょっと単純化したと仮定して、あなたが私に見せたように、1つの信号からいくつかのスロットを接続したくないです。 – Max

関連する問題