Python-PyQt使用多个listView连接到一个带有信号/槽的函数

时间:2013-01-20 00:50:10

标签: python listview pyqt signals-slots

我正在尝试让我的代码使用多个listView而不只是一个但是我遇到了问题。

一个清单的工作代码:

Class Ui_MainWindow(QtGui.QMainWindow):
    def itemDropped(self, links):
        item = QtGui.QListWidgetItem(url, self.listView)
    def setupUi(self, MainWindow):
        self.connect(self.listView, QtCore.SIGNAL("dropped"), self.itemDropped)  

Class TestListView(QtGui.QListWidget):
    def dropEvent(self, event):
        self.emit(QtCore.SIGNAL("dropped"), links)

到目前为止我使用多个列表:

Class Ui_MainWindow(QtGui.QMainWindow):
    def itemDropped(self, links, listName):
        item = QtGui.QListWidgetItem(url, listName)
    def setupUi(self, MainWindow):
        self.connect(self.listView, QtCore.SIGNAL("dropped"), self.itemDropped(self.listView))  

Class TestListView(QtGui.QListWidget):
    def dropEvent(self, event):
        self.emit(QtCore.SIGNAL("dropped"), links)

所以我收到了“self.itemDropped(self.listView)”的错误,经过对这里和其他网站的研究后我想出了这个:

self.connect(self.listView, QtCore.SIGNAL("dropped"),(lambda : self.itemDropped(self.listView)))

之前我从未使用过lambda函数,因为我对python很新,但确实解决了这个问题,当我打印listName时它正确显示。现在的问题是链接没有从其他类正确发出,或者我没有正确地接收它们。

所以我猜pseduocode我需要这样的东西:

self.connect(self.listView, QtCore.SIGNAL("dropped"),(lambda : self.itemDropped(X, self.listView)))

问题是如何获取X,即TestListView类的链接?当没有变量传递给函数时,我不太明白我只用1个列表接收它们。

感谢您提供任何帮助,我非常感谢。 附:如果您想要更大的图片PyQT4: Drag and drop files into QListWidget

,这里的代码可能看起来很熟悉

1 个答案:

答案 0 :(得分:1)

你想要的是这个

self.connect(self.listView, QtCore.SIGNAL("dropped"),(lambda X: self.itemDropped(X, self.listView)))

当您发出信号时,您将links变量传递到插槽中,该插槽曾是self.itemDropped(其签名为self.itemDropped (links))。

相反,您的插槽现在是一个lambda函数,因此您需要通过使用lambda X:启动定义将其定义为1变量的函数。然后,这使X可用于lambda定义的其余部分。

发出信号时,会调用lambda函数,X包含links

一般情况下:     def foo(x):         do_something(x)的     FOO(3)

相当于     my_function = lambda x:do_something(x)     创建my_function(3)

有意义吗?

编辑:我还应该指出(对于你将来的任何应用程序)在lambda函数中使用变量时有一些棘手的问题(特别是使用lambda函数定义中未指定的变量,例如使用self.listView)。当调用lambda函数时(发出信号时),它将使用self.listView的当前值,而不是函数定义时的值。在循环中定义lambda函数并尝试在lambda函数中使用循环变量时,这会成为一个问题。这里可以找到一些有用的信息(也可以阅读评论)http://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot/