Python的PyQt使用多个listViews连接到一个信号/插槽功能
我试图让我的代码与多个listViews而不是一个,但我有一个问题。Python的PyQt使用多个listViews连接到一个信号/插槽功能
工作守则一个列表:
我有什么到目前为止使用多个列表:
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函数befo因为我对python相当陌生,但是确实解决了这个问题,当我打印listName时,它显示正确。现在的问题是链接不能正确地从其他课程发布,或者我没有正确接收它们。
所以我想pseduocode我需要的东西是这样的:
self.connect(self.listView, QtCore.SIGNAL("dropped"),(lambda : self.itemDropped(X, self.listView)))
的问题是如何获得X,即从TestListView类的链接?我不太明白当没有变量传递给函数时,我只用1个列表来接收它们。
感谢您提供的任何帮助,我非常感谢。 P.s.如果你想有一个更大的画面从这里的代码可能看起来很熟悉PyQT4: Drag and drop files into QListWidget
你想这是什么
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 =拉姆达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/
哇,这是完美的理解,完美地工作,我喜欢我的“伪代码”只是一封信,也与你张贴的链接,我不知道不知道谷歌是如何找不到的,正是我所需要的,生病得在附近挖掘,看看我还能学到什么,谢谢! – Burninghelix123
也欢迎堆栈溢出! – Burninghelix123