2013-03-24 20 views
5

Tôi chỉ định một vị trí với điều này.pyqt ngắt kết nối khe. Phong cách mới

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

nhưng làm thế nào tôi có thể ngắt kết nối? Tôi đã thử với điều này, nhưng nó không hoạt động ...

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

Trả lời

11

Các biểu thức lambda trở chức năng khác nhau mà (nhiều hơn hoặc ít hơn một cách tình cờ;)) sẽ làm điều tương tự. Vì vậy, những gì bạn kết nối tín hiệu của bạn không phải là điều tương tự như lambda thứ hai bạn đang sử dụng khi cố gắng ngắt kết nối nó; xem ví dụ này:

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

Bạn có thể sử dụng self.query.textChanged.disconnect() mà không cần bất kỳ thông số, mà sẽ ngắt kết nối tín hiệu từ tất cả khe (mà có thể là ok nếu bạn chỉ có mà một kết nối) hoặc bạn sẽ phải lưu trữ một tham chiếu đến lambda ở đâu đó:

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

Tôi muốn thêm lời nhắc/tiện ích mở rộng vào câu trả lời của @ rainer liên quan đến các phương pháp bị ràng buộc. Hãy nhớ rằng ràng buộc một phương thức cho một cá thể (ví dụ: bằng cách viết self.slotname) thực sự tạo ra một đóng mới mỗi lần (như trong câu hỏi this).

Bạn do đó sẽ có cùng một vấn đề làm

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

... 

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

... 

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

như bạn đã làm với bản gốc lambda trong câu hỏi của bạn. Giải pháp là lưu trữ đóng cửa self.test_slot trong thuộc tính, như @rainer đề xuất. Điều này là cần thiết vì một đối tượng mới gần tương đương với lambda: type(self).test_slot(self) được tạo mỗi khi bạn viết self.test_slot trong mã của bạn. Nội dung sau sẽ hoạt động tốt miễn là bạn lưu trữ chính xác sách:

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

... 

    self.query.textChanged.disconnect(self.func) 
Các vấn đề liên quan