2017-03-08 46 views
1

我正在開發GIS軟件QGIS的插件。我有一個QAction圖標,當它被選中時,它將組中的圖層連接到一個功能,只要它們的可見性被切換。然後,當它未被選中,它應該斷開這些功能,而是我收到一個錯誤:如何從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(),但這會斷開所有信號,所以不符合我的興趣。

+0

可能複製http://gis.stackexchange.com/questions/227719/how-to-disconnect-a-signal-when-untoggling-plugin-icon –

+0

@FranciscoRaga - 儘管你在帖子中的答案與作品鏈接,但這個新問題是問***爲什麼***可以在'if'語句中連接,但不能在'else'語句中斷開連接。 – Joseph

回答

2

對於我PyQt的手冊中瞭解,你應該試試這種方法:

layers.disconnect(print_one) 

但我不知道和可惜我沒有時間去嘗試...

+0

感謝您的回答,不幸的是這會產生一個錯誤:'TypeError:參數不匹配任何重載調用: QObject.disconnect(QObject,SIGNAL(),QObject,SLOT()):參數1具有意想不到的類型「函數」 QObject.disconnect(QObject,SIGNAL(),可調用):參數1有意想不到的類型'function'' – Joseph

+0

我的不好,我不明白你想做什麼。 – Viper

+0

不要擔心,我只找到了解決方法,所以問題仍然是開放的:) – Joseph

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) 

仍然好奇,爲什麼我不能使用問題中顯示的方法斷開它,但在此期間,這是有效的。

1

the documentation(重點煤礦):

disconnect([slot])

Disconnect one or more slots from a signal. An exception will be raised if the slot is not connected to the signal or if the signal has no connections at all.

因此,你正在接受一個異常,因爲當你試圖斷開連接的信號不被連接到槽。

作爲一種變通方法:

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 
+0

感謝您的回答,但這正是我以前的嘗試。顯然沒有錯誤出現,因爲它被傳遞,但由於某種原因,它仍然不會斷開插槽。 – Joseph