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

0 投票
1 回答
735 浏览
提问于 2025-04-17 13:16

我正在尝试让我的代码支持多个列表视图,而不仅仅是一个,但遇到了一些问题。

这是我为一个列表写的工作代码:

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 个回答

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/

撰写回答