3

PyQt を学習しています (以前に C++ Qt を使用したことがありません)。

シグナルとスロットの理由がわかりません。つまり、クラスのメソッドを直接呼び出すだけで何でもできるようです。そうすることでより Pythonic に見え、使用するコードが少なくなり、読みやすくなります。私は何が欠けていますか?

明確にするために、なぜこれを行うのかを尋ねています。

def mouseReleaseEvent(self):  
    self.clicksignal.connect(ui.iconClicked) 
    self.clicksignal.emit()

私がこれを行うことができるとき:

def mouseReleaseEvent(self): 
    ui.iconClicked()
4

3 に答える 3

8

シグナルとスロットが存在する理由は、UI スレッド以外のアプリケーションの他のスレッドから GUI を変更できないためです。

CPU を集中的に使用する計算を行う場合、または IO などを待機するタスクがある場合... UI スレッドを実行する場合 (たとえば、URL をフェッチする場合など、しばらく時間がかかる場合)、UIスレッドがビジーになり、GUI イベント ループがそれ自体を更新できなくなり、GUI がフリーズしたように見えます。

このような操作を行うため。それらを別の (バックグラウンド ワーカー) スレッドで実行すると、UI スレッドは GUI の更新を続行できます。

問題は、GUI の要素にアクセスできず、UI スレッド以外の他のスレッドからその状態を変更できないことです。そのため、シグナルとスロットが導入されます。シグナルを発行すると、UI スレッドでキャッチされることが保証され、スロットは UI スレッドで実行されます。

あなたの例で何を達成しようとしているのか正確にはわかりませんが、これがシグナルとスロットが存在する主な理由です。基本的に、UI スレッドは UI のみを処理する必要があり、それ以外はすべて、UI スレッドでキャッチされるシグナルを送信するバックグラウンド ワーカー スレッドで実行する必要があり、GUI を更新するスロットは UI スレッドで実行されます。

于 2013-09-02T07:57:15.250 に答える
4

@ViktorKerkez と @Wilbur による回答に加えて、シグナルとスロットは、クラスの分離だけでなく、ファイア アンド フォーゲットの通知システムを提供します。

これの大きな利点は、クラスがシグナルを発信できることです。そのメッセージを誰が、何を受信するかはわかりません。スロットが接続されているオブジェクトは 1 つだけの場合もあれば、数十の場合もあります。あるいは、複数の信号に接続された 1 つのスロットを持つ単一のクラスが必要な場合もあります。そのため、通知システムとして使用できます。

たとえば、さまざまな種類のオブジェクトが情報をログに送信するプログラムを想像してください。オブジェクトは単に Log(text) シグナルを発行するだけで、実際にログを記録する内容は気にしません。これらのシグナルは、ファイル、ネットワーク経由、画面、または一度にすべてを記録できるログ クラスに接続できます。ロギングするオブジェクトは気にしません。

于 2013-09-02T08:49:46.660 に答える
4

ええ、できます。しかし、もっと大きく考える必要があります。コード例では、の呼び出し元mouseReleaseEventは、通知を受け取るオブジェクトへの参照を持ち、適切なメソッドを明示的に呼び出す必要があります。スロットとシグナルのメカニズムを使用すると、イベント プロデューサー (ウィジェットなど) をイベント コンシューマー (ほとんど任意の他のオブジェクト) から分離できます。これにより、通信と制御フローの設定が簡単になり、低レベルの UI コンポーネントの外部になります。これは良いことです。また、そのようなコンポーネントを再利用可能にします。配線コードを外部に移動することで、アプリケーション ロジックから独立させます。

于 2013-09-02T07:57:39.847 に答える