PyQtはシグナルに接続するときにパラメータをスロットに送信します

StackOverflow https://stackoverflow.com/questions/940555

  •  06-09-2019
  •  | 
  •  

質問

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

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

ソース: snip2code - PyQt4に追加の引数を渡すためにラムダ関数を使用する

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top