PyQtはシグナルに接続するときにパラメータをスロットに送信します
質問
タスクバーメニューがあり、クリックするとトリガーイベントを取得するスロットに接続されます。問題は、どのメニュー項目がクリックされたかを知りたいのですが、接続されている関数にその情報を送信する方法がわかりません。アクションを関数に接続するために使用されるのは次のとおりです。
QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)
一部のイベントは値を返しますが、triggered() は値を返しません。では、どうすればこれを実現できるでしょうか?自分で信号を作成する必要がありますか?
解決
タグ
lambda
を使用してください
ここでのPyQt帳のrel="noreferrer"> ところで、あなたもself.connect(button3, SIGNAL("clicked()"),
lambda who="Three": self.anyButton(who))
functools.partial
を使用することができますが、私はlambda
方法は、簡単かつ明確に見つけます。
他のヒント
ここではは、あなたが実行したいメソッドに追加の引数を渡すためにラムダ関数を使用することができを。
この例では、ボタンが押されたときに呼び出さ)(関数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
functools.partial使用
それ以外の場合は、あなたがラムダを使用する場合は、スクリプトが実行されている動的に引数を渡すことはできませんでしょう。
一般に、各メニュー項目を異なるスロットに接続し、各スロットが独自のメニュー項目の機能のみを処理するようにする必要があります。たとえば、「保存」、「閉じる」、「開く」などのメニュー項目がある場合は、case ステートメントを含む 1 つのスロットを作成するのではなく、それぞれに個別のスロットを作成する必要があります。
そのようにしたくない場合は、 QObject::sender() 送信者へのポインタを取得する関数 (つまり:信号を発した物体)。ただし、何を達成しようとしているのかについてもう少し詳しく聞きたいです。
私はまた、あなただけのウィジェットシグナルを送ったかを調べる必要がある場合は、sender
メソッドを使用することができることを追加したいと思います。たとえばます:
def menuClickedFunc(self):
# The sender object:
sender = self.sender()
# The sender object's name:
senderName = sender.objectName()
print senderName