1

文字列のリストから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種類の接続の違いに気づいたことはありません。

4

1 に答える 1

0

それはlambda、ではなく、デフォルトの引数を持つシグナルがQtでどのように実装されるかについてです。

void triggered(bool = 0)

実際には2つの信号です:

void triggered(bool)
void triggered()

PyQtのドキュメントでは、このシグナルのデフォルトのオーバーロードについて言及していtriggered(bool)ます。関数は引数を受け入れるため、このシグナルを関数に正常に接続できます。したがって、boolパラメータはに渡されますitem

構文にインデックスを付けることで、特定のオーバーロードを選択できます。この場合、パラメータのない信号が必要なので、次のようにします。

action.triggered[()].connect(l)
于 2012-07-04T20:56:52.813 に答える