我已经为这样的组合框分配了一种方法
def run(self):
GetAllLayers(self) #custom Methods
#attach index changed event / passing parametric method
self.dlg.cbLayerNamesAll.currentIndexChanged.connect(lambda arg=self: LayersValueChange(arg))
在这里收到错误
def LayersValueChange(self):
layers = self.iface.legendInterface().layers()//here error
错误是:
layers = self.iface.legendInterface()。layers()
AttributeError的: ' INT'对象没有属性' iface'
自我是对象,但它像int一样。
答案 0 :(得分:2)
假设LayersValueChange
是外部函数而不是同一类的方法,您可以像这样连接信号:
self.dlg.cbLayerNamesAll.currentIndexChanged.connect(
lambda: LayersValueChange(self))
这简单地忽略了信号发送的参数,并创建了一个功能框,允许稍后引用self
(因此不需要使用arg=self
)。
如果你还想要信号发送的索引,你将不得不改变函数的签名,然后像这样连接信号:
self.dlg.cbLayerNamesAll.currentIndexChanged.connect(
lambda index: LayersValueChange(self, index))
def LayersValueChange(self, index):
layers = self.iface.legendInterface().layers()
print(index)
然而,更好的设计是使同一类的所有函数方法。然后你的代码看起来像这样:
class MyClass(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MyClass, self).__init__(parent)
...
self.dlg.cbLayerNamesAll.currentIndexChanged.connect(
self.layersValueChange)
def run(self):
self.getAllLayers()
def layersValueChange(self, index):
layers = self.iface.legendInterface().layers()
def getAllLayers(self):
...
答案 1 :(得分:0)
信号的整个签名是:currentIndexChanged(int index)
(请参阅the doc)。因此,您的lambda接收的参数类型为int
,根据该信息,Python假定self
的{{1}}参数的类型为LayersValueChanged
。
你需要做两件事:
不要将self作为默认参数传递。实际上,您不需要任何默认参数,因为int
始终提供一个。
更改您的插槽签名以正确接受int参数:
currentIndexChanged