我正在尝试让我的代码使用多个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
,这里的代码可能看起来很熟悉答案 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/