我正在为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()
但这会断开所有信号,因此不符合我的利益。
答案 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)
仍然好奇为什么我不能使用问题中显示的方法断开它,但与此同时,这是有效的。