Python-PyQt 使用多个连接到一个信号/槽的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时,它显示得很正确。现在的问题是,来自另一个类的链接没有正确发出,或者说我没有正确接收到它们。
所以我想我需要一些伪代码,类似于这样:
self.connect(self.listView, QtCore.SIGNAL("dropped"),(lambda : self.itemDropped(X, self.listView)))
我的问题是,如何从TestListView类中获取X,也就是那些链接?我不太明白,之前只有一个列表时我是怎么接收到它们的,因为当时没有变量传递给这个函数。
感谢你们提供的任何帮助,我非常感激。
附注:这里的代码可能看起来很熟悉,如果你想了解更大的背景,可以查看这个链接 PyQT4: 将文件拖放到QListWidget中
1 个回答
你想要的是这个
self.connect(self.listView, QtCore.SIGNAL("dropped"),(lambda X: self.itemDropped(X, self.listView)))
当你发出信号时,你把 links
这个变量传给了槽函数,之前这个槽函数是 self.itemDropped
(它的定义是 self.itemDropped (links)
)。
现在你的槽函数变成了一个 lambda 函数,所以你需要用 lambda X:
来定义它,这样 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/