7

これでスロットを割り当てます。

...
self.query = QtGui.QLineEdit(self)            
self.query.textChanged.connect(lambda: self.makeThread(self.googleSearch()))
self.query.returnPressed.connect(lambda: self.launchNavigator(1))
...

しかし、どうすれば切断できますか?これで試してみましたが、うまくいきません...

self.query.textChanged.disconnect(lambda: self.makeThread(self.googleSearch()))
self.query.returnPressed.disconnect(lambda: self.launchNavigator(1))
4

3 に答える 3

15

ラムダ式は、(多かれ少なかれ偶然に;))同じことを行うさまざまな関数を返します。したがって、信号を接続したものは、信号を切断しようとしたときに使用している2番目のラムダと同じではありません。この例を参照してください。

>>> f = lambda x: x
>>> g = lambda x: x
>>> f is g
False

self.query.textChanged.disconnect()パラメータなしで使用して、すべてのスロットから信号を切断するか(接続が1つしかない場合は問題ない可能性があります)、ラムダへの参照をどこかに保存する必要があります。

self.func1 = lambda: self.makeThread(self.googleSearch())
self.query.textChanged.connect(self.func1)
...
self.query.textChanged.disconnect(self.func1)
于 2013-03-24T15:40:28.017 に答える
2

元の接続によって返されたQConnectionオブジェクトを使用して、シグナルを切断する洗練された方法があります。それで:

self.conn1 = self.query.textChanged.connect(lambda: self.makeThread(self.googleSearch()))
self.conn2 = self.query.returnPressed.connect(lambda: self.launchNavigator(1))

そしてその後:

self.disconnect(self.conn1)
self.disconnect(self.conn2)

この機能は、Qtに長い間存在していましたが、PyQt5.13.1より前には実装されていませんでした。

于 2019-10-26T11:35:31.603 に答える
1

バインドされたメソッドに関する@rainerの回答に警告/拡張を追加したいと思います。メソッドをインスタンスにバインドする(たとえば、書くことによってself.slotname)と、実際には毎回(この質問のように)新しいクロージャーが作成されることに注意してください。

したがって、同じ問題が発生します

def test_slot(self):
    self.makeThread(self.googleSearch())

...

    self.query.textChanged.connect(self.test_slot)

...

    self.query.textChanged.disconnect(self.test_slot)

lambdaあなたがあなたの質問のオリジナルでしたように。解決策は、@ rainerが提案するように、クロージャ self.test_slotを属性に格納することです。これが必要なのは、コードlambda: type(self).test_slot(self)を記述するたびに、ほぼ同等の新しいオブジェクトが生成されるためです。self.test_slot簿記を正確に行う限り、以下は問題なく機能します。

    self.func = self.test_slot
    self.query.textChanged.connect(self.func)

...

    self.query.textChanged.disconnect(self.func)
于 2017-04-25T06:33:32.047 に答える