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/

+0

哇,这是完美的理解,完美地工作,我喜欢我的“伪代码”只是一封信,也与你张贴的链接,我不知道不知道谷歌是如何找不到的,正是我所需要的,生病得在附近挖掘,看看我还能学到什么,谢谢! – Burninghelix123

+0

也欢迎堆栈溢出! – Burninghelix123