簡體   English   中英

pyqt 斷開插槽。 新風格

[英]pyqt disconnect slots. New style

我為此分配了一個插槽。

...
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))

lambda 表達式返回不同的函數,這些函數(或多或少是偶然的 ;) )會做同樣的事情。 因此,您將信號連接到的內容與您嘗試斷開連接時使用的第二個 lambda 不同; 看這個例子:

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

您可以使用不帶任何參數的self.query.textChanged.disconnect() ,這將斷開所有插槽的信號(如果您只有一個連接,這可能沒問題),或者您必須在某處存儲對 lambda 的引用:

self.func1 = lambda: self.makeThread(self.googleSearch())
self.query.textChanged.connect(self.func1)
...
self.query.textChanged.disconnect(self.func1)

我想在@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存儲在一個屬性中。 這是必要的,因為每次在代碼中編寫self.test_slot時都會生成一個大致相當於lambda: type(self).test_slot(self)的新對象lambda: type(self).test_slot(self) 只要您准確地進行簿記,以下內容就可以正常工作:

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

...

    self.query.textChanged.disconnect(self.func)

有一種使用原始連接返回的 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)

這個特性在 PyQt 5.13.1 之前沒有實現,雖然它在 Qt 中已經存在很長時間了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM