1

我正在为 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(),但这会断开所有信号,因此不符合我的兴趣。

4

3 回答 3

2

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

layers.disconnect(print_one)

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

于 2017-03-08T11:08:31.330 回答
1

文档(强调我的):

断开连接([插槽])

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

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

作为一种解决方法:

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
于 2017-03-08T20:48:26.203 回答
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) 

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

于 2017-03-08T12:02:44.357 回答