クリックするとトリガーイベントを取得するスロットに接続されるタスクバーメニューがあります。問題は、どのメニュー項目がクリックされたかを知りたいのですが、接続されている関数にその情報を送信する方法がわかりません。アクションを関数に接続するために使用されるものは次のとおりです。
QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)
一部のイベントが値を返すことは知っていますが、triggered()は返しません。では、どうすればこれを実現できますか?自分で信号を出す必要がありますか?
lambda
を使用します
これが PyQt本 からの例です:
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ステートメントを含む単一のスロットを作成するのではなく、それぞれに個別のスロットを作成する必要があります。
そのようにしたくない場合は、 QObject :: sender() 関数を使用して、送信者(つまり、信号を発行したオブジェクト)へのポインターを取得できます。しかし、あなたが達成しようとしていることについてもう少し聞きたいのですが。
また、どのウィジェットがシグナルを送信したかを調べる必要がある場合は、sender
メソッドを使用できることも付け加えておきます。例えば:
def menuClickedFunc(self):
# The sender object:
sender = self.sender()
# The sender object's name:
senderName = sender.objectName()
print senderName