Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何断开功能与QAction的连接?_Python_Qt4_Qgis_Qaction - Fatal编程技术网

Python 如何断开功能与QAction的连接?

Python 如何断开功能与QAction的连接?,python,qt4,qgis,qaction,Python,Qt4,Qgis,Qaction,我正在为GIS软件QGIS开发一个插件。我有一个图标,当选中时,它将组中的层连接到一个函数,只要它们的可见性被切换。然后,如果未选中,则应断开这些功能,但我收到一个错误: Traceback (most recent call last): File "C:/Users/Me/.qgis2/python/plugins\Example\Example.py", line 248, in run layers.visibilityChanged.disconnect(print_one

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

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)            

为什么信号没有断开


我可以只使用层.visibilityChanged.disconnect(),但这会断开所有信号的连接,因此不符合我的兴趣。

对于我在PyQt手册中了解的内容,您应该尝试以下方法:

layers.disconnect(print_one)

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

我想我找到了另一种方法,包括一个
if
语句来检查QAction图标是否被选中,并将其放入
print\u 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) 
仍然很好奇为什么我不能用问题中所示的方法断开连接,但同时,这是可行的。

来自(强调我的):

断开([插槽])

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

因此,您正在接收一个异常,因为当您尝试断开插槽时,该信号未连接到插槽

作为解决办法:

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

感谢您的回答,不幸的是,这产生了一个错误:
TypeError:参数与任何重载调用不匹配:QObject.disconnect(QObject,SIGNAL(),QObject,SLOT()):参数1具有意外的类型“function”QObject.disconnect(QObject,SIGNAL(),callable):参数1具有意外的类型“function”
My bad,我不明白你想做什么。别担心,我只是找到了一个解决办法,所以问题仍然悬而未决:)可能重复@FranciscoRaga-尽管你链接到的帖子中的答案是有效的,这个新问题是问为什么它可以在
if
语句中连接,而不能在
else
语句中断开。谢谢你的回答,但这正是我以前尝试过的。显然没有出现错误,因为它正在被传递,但由于某种原因它仍然没有断开插槽的连接。。。