PyQt は、オブジェクト間の通信にさまざまなシグナルとスロットのメカニズムを提供します。シグナルはリスナーにイベントを通知するために発行されますが、スロットはシグナルの受信時に実行されるメソッドです。一般的な使用例の 1 つは、信号からスロットにデータを渡すことです。しかし、信号とともに追加のデータを送信したい場合はどうすればよいでしょうか?この記事では、ラムダ関数と functools.partial を使用してシグナルを通じて追加の引数を渡す方法について説明します。
Python では、ラムダ関数は匿名関数です。インラインで定義する必要があります。これらは、スロットの定義を変更せずに追加の引数をスロットに渡す便利な方法を提供します。構文は次のとおりです:
signal.connect(lambda param1, param2, ..., arg1=val1, arg2=value2, ... : fun(param1, param2,... , arg1, arg2, ....))
ここで:
たとえば、次のコード:
def addLineEdit(self): self.buttonGroup.buttonClicked['int'].connect(lambda i: self.input(i, "text")) @pyqtSlot(int) def input(self, button_or_id, DiffP): if isinstance(button_or_id, int): if button_or_id == 0: self.TotalInput[0].setText(DiffP) elif button_or_id == 1: self.TotalInput[54].setText('1')
この例では、追加の引数「text」を渡すラムダ関数を使用して、buttonClicked 信号がスロット (入力) に接続されます。次に、入力スロットは DiffP 引数を使用して TotalInput ウィジェットを変更します。
シグナルを介して追加の引数を渡すもう 1 つの方法は、functools.partial を使用することです。この関数は、元の関数の引数のサブセットが既に入力されている新しい関数を作成します。構文は次のとおりです。
signal.connect(partial(fun, args1, arg2, ... ))
ここで、
たとえば、次のコードを考えてみましょう:
from functools import partial self.buttonGroup.buttonClicked['int'].connect(partial(self.input, "text")) @pyqtSlot(int) def input(self, DiffP, button_or_id): if isinstance(button_or_id, int): if button_or_id == 0: self.TotalInput[0].setText(DiffP) elif button_or_id == 1: self.TotalInput[54].setText('1')
この例では、functools.partial を使用して、既に "text" 引数がバインドされている新しい関数を作成します。 。 buttonClicked シグナルが発行されると、DiffP 引数と以前に渡された "text" 引数を使用して入力スロットが呼び出されます。
シグナルを介して追加の引数を渡すことは、PyQt では便利なテクニックとなり得ます。発達。これにより、信号とともに追加のデータを転送できるようになり、オブジェクト間の通信が強化されます。 lambda 関数と functools.partial の使用法を理解することで、PyQt アプリケーションでこの機能を効果的に活用できます。
以上がPyQt でシグナルを通じて追加の引数を渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。