【问题标题】:pyqt disconnect slots. New stylepyqt 断开插槽。新风格
【发布时间】:2013-03-24 15:02:59
【问题描述】:

我为此分配了一个插槽。

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

【问题讨论】:

    标签: python pyqt signals disconnect slot


    【解决方案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)
    

    【讨论】:

    • 你所说的lambas,functools.partial也是这样吗?
    【解决方案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)
    

    这个特性在 PyQt 5.13.1 之前没有实现,尽管它在 Qt 中已经存在很长时间了。

    【讨论】:

    • 这应该是公认的答案,这是最干净的方法。
    【解决方案3】:

    我想在@rainer 的关于绑定方法的答案中添加一个警告/扩展。请记住,将方法绑定到实例(例如,通过编写 self.slotname)实际上每次都会创建一个新的闭包(如 this 问题中所示)。

    因此你会遇到同样的问题

    def test_slot(self):
        self.makeThread(self.googleSearch())
    
    ...
    
        self.query.textChanged.connect(self.test_slot)
    
    ...
    
        self.query.textChanged.disconnect(self.test_slot)
    

    就像您在问题中对原始 lambda 所做的那样。正如@rainer 建议的那样,解决方案是将closure self.test_slot 存储在一个属性中。这是必要的,因为每次您在代码中编写self.test_slot 时都会生成一个大致相当于lambda: type(self).test_slot(self) 的新对象。只要您准确记账,以下内容就可以正常工作:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-13
      • 2014-02-18
      • 2017-05-05
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      相关资源
      最近更新 更多