文字列のリストからPyQtメニューを作成するためのフォローアップでは、その場でメニューも作成していて、どのメニュー項目がクリックされたかを知りたいと思っています。したがって、次のようなコードを使用しました。
for item in ADDABLE_OBJECTS:
action = self.menuAdd.addAction(item)
l = lambda item=item: self.doStuff(item)
action.triggered.connect(l)
def doStuff(self, item):
print "Item: ", item
Ouput:
アイテム:False(triggered()シグナルのQt Docsに記載されているデフォルトの「bool」パラメーター)
object.connect()は、connect(object、SIGNAL(...)、slot)と比較して「新しい」形式だと思ったので。また、コンパイル時にシグナル名を確認できるので、うまく機能します。しかし、それは機能しませんでした。私が合格したのは「bool=false」だけでした(triggered()のQtドキュメントに記載されています)。したがって、検索した後、上記のURLに出くわしました。いいえ、私はこれを持っています:
for item in ['One', 'Two', 'Three']:
action = self.menuAdd.addAction(item)
l = lambda item=item: self.doStuff(item)
action.triggered.connect(l)
self.connect(action, SIGNAL('triggered()'), l)
これは(メニューを1回クリックすると)次のようになります。
アイテム:False(action.triggered.connect(l)行、間違っています)アイテム:1つ(self.connect行、右)
なぜこれら2つは異なる動作をするのですか?このラムダ構造を使用するまで、2種類の接続の違いに気づいたことはありません。