web-dev-qa-db-ja.com

信号に接続するときにスロットにパラメータを送信するPyQt

クリックするとトリガーイベントを取得するスロットに接続されるタスクバーメニューがあります。問題は、どのメニュー項目がクリックされたかを知りたいのですが、接続されている関数にその情報を送信する方法がわかりません。アクションを関数に接続するために使用されるものは次のとおりです。

QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)

一部のイベントが値を返すことは知っていますが、triggered()は返しません。では、どうすればこれを実現できますか?自分で信号を出す必要がありますか?

28
johannix

lambdaを使用します

これが PyQt本 からの例です:

self.connect(button3, SIGNAL("clicked()"),
    lambda who="Three": self.anyButton(who))

ちなみに、functools.partialを使用することもできますが、lambdaメソッドの方が簡単でわかりやすいと思います。

44
Eli Bendersky

すでに述べたように ここ ラムダ関数を使用して、実行するメソッドに追加の引数を渡すことができます。

この例では、ボタンが押されたときに呼び出される関数AddControl()に文字列objを渡すことができます。

# Create the build button with its caption
self.build_button = QPushButton('&Build Greeting', self)
# Connect the button's clicked signal to AddControl
self.build_button.clicked.connect(lambda: self.AddControl('fooData'))
def AddControl(self, name):
    print name

ソース: snip2code-Lambda関数を使用してPyQt4で追加の引数を渡す

10
Dominique Terrs

functools.partialを使用する

そうしないと、ラムダを使用している場合、スクリプトの実行時に動的に引数を渡すことができないことがわかります。

3
Eric Wang

一般に、各メニュー項目を異なるスロットに接続し、各スロットにそれ自体のメニュー項目の機能のみを処理させる必要があります。たとえば、「保存」、「閉じる」、「開く」などのメニュー項目がある場合は、caseステートメントを含む単一のスロットを作成するのではなく、それぞれに個別のスロットを作成する必要があります。

そのようにしたくない場合は、 QObject :: sender() 関数を使用して、送信者(つまり、信号を発行したオブジェクト)へのポインターを取得できます。しかし、あなたが達成しようとしていることについてもう少し聞きたいのですが。

0
KeyserSoze

また、どのウィジェットがシグナルを送信したかを調べる必要がある場合は、senderメソッドを使用できることも付け加えておきます。例えば:

def menuClickedFunc(self):
    # The sender object:
    sender = self.sender()
    # The sender object's name:
    senderName = sender.objectName()
    print senderName
0
shalinar