Python 如何断开功能与QAction的连接?
我正在为GIS软件QGIS开发一个插件。我有一个图标,当选中时,它将组中的层连接到一个函数,只要它们的可见性被切换。然后,如果未选中,则应断开这些功能,但我收到一个错误: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
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
语句中断开。谢谢你的回答,但这正是我以前尝试过的。显然没有出现错误,因为它正在被传递,但由于某种原因它仍然没有断开插槽的连接。。。