35

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

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

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

4

5 に答える 5

53

使うlambda

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

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

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

于 2009-06-02T16:52:11.950 に答える
16

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

この例では、ボタンが押されたときに呼び出される関数 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 で追加の引数を渡す

于 2013-11-03T10:56:42.807 に答える
4

functools.partial を使用

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

于 2015-11-30T15:13:04.773 に答える
0

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

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

于 2009-06-02T16:52:40.530 に答える