如何从QAction断开功能?

时间:2017-03-08 09:54:27

标签: python qt4 qgis qaction

我正在为GIS软件QGIS开发一个插件。我有一个QAction图标,当选中它时,只要切换它们的可见性,就会将组中的图层连接到一个函数。然后,如果未选中,则应断开这些功能,但我收到错误:

Traceback (most recent call last):
  File "C:/Users/Me/.qgis2/python/plugins\Example\Example.py", line 248, in run
    layers.visibilityChanged.disconnect(print_one)            
TypeError: 'function' object is not connected

这是一个示例代码:

def run(self, checked):
    root = QgsProject.instance().layerTreeRoot()
    group = root.findGroup('Group')

    def print_one():
        print 'one'

    if checked == True:            
        for layers in group.children():
            layers.visibilityChanged.connect(print_one)            
    else:
        for layers in group.children():
            layers.visibilityChanged.disconnect(print_one)            

为什么信号没有断开?

我可以使用layers.visibilityChanged.disconnect()但这会断开所有信号,因此不符合我的利益。

3 个答案:

答案 0 :(得分:2)

对于我在PyQt手册中理解的内容,您应该尝试这种方式:

layers.disconnect(print_one)

但我不确定,遗憾的是我没有时间去尝试......

答案 1 :(得分:1)

来自the documentation(强调我的):

  

<强>断开([槽])

     

断开信号中的一个或多个插槽。 如果插槽未连接到信号或信号根本没有连接,则会引发异常。

因此,您收到异常,因为当您尝试断开连接时,信号未连接到插槽。

作为解决方法:

if checked == True:            
    for layers in group.children():
        layers.visibilityChanged.connect(print_one)            
else:
    for layers in group.children():
        try:
            layers.visibilityChanged.disconnect(print_one) 
        except:
            pass

答案 2 :(得分:0)

猜猜我发现了另一种方法,即包含一个if语句来检查QAction图标是否被选中,并将其放在print_one()函数中:

def run(self):
    root = QgsProject.instance().layerTreeRoot()
    group = root.findGroup('Group')

    def print_one():
        if self.plugin_icon.isChecked():
            print 'one'
        else:
            layers.visibilityChanged.disconnect(print_one)             

    for layers in group.children():
        layers.visibilityChanged.connect(print_one) 

仍然好奇为什么我不能使用问题中显示的方法断开它,但与此同时,这是有效的。