用于连接的参数化功能

时间:2016-10-05 12:33:27

标签: pyqt

我已经为这样的组合框分配了一种方法

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一样。

2 个答案:

答案 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

你需要做两件事:

  1. 不要将self作为默认参数传递。实际上,您不需要任何默认参数,因为int始终提供一个。

  2. 更改您的插槽签名以正确接受int参数:

    currentIndexChanged