【问题标题】:Python-PyQt Using multiple listViews connected to one function with a signal/slotPython-PyQt 使用多个 listViews 连接到一个带有信号/插槽的函数
【发布时间】:2013-01-20 00:50:09
【问题描述】:

我正在尝试让我的代码与多个 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

【问题讨论】:

    标签: python listview pyqt signals-slots


    【解决方案1】:

    你想要的是这个

    self.connect(self.listView, QtCore.SIGNAL("dropped"),(lambda X: self.itemDropped(X, self.listView)))
    

    当您发出信号时,您会将links 变量传递到插槽中,该变量以前是self.itemDropped(其签名是self.itemDropped (links))。

    相反,您的 slot 现在是一个 lambda 函数,因此您需要通过以 lambda X: 开头的定义来将其定义为 1 个变量的函数。这使得 X 可用于 lambda 定义的其余部分。

    当您的信号发出时,您的 lambda 函数会被调用并且X 包含links

    一般来说: 定义 foo(x): do_something(x) 富(3)

    相当于 my_function = lambda x: do_something(x) 我的函数(3)

    有意义吗?

    编辑:我还应该指出(对于您将来拥有的任何应用程序)在 lambda 函数中使用变量时存在一些棘手的问题(特别是使用未在 lambda 函数的定义中指定的变量,例如使用self.listView)。当调用 lambda 函数时(发出信号时),它将使用 self.listView 的当前值,而不是定义函数时的值。当在循环中定义 lambda 函数并尝试在 lambda 函数中使用循环变量时,这会成为一个问题。一些有用的信息可以在这里找到(也可以阅读 cmets)http://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot/

    【讨论】:

    • 哇,这很有意义,完美无瑕,我喜欢我的“伪代码”只是一个字母,还有你发布的那个链接,我不知道谷歌怎么找不到这正是我所需要的,我必须在那里挖掘,看看我还能学到什么,谢谢!
    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 2020-09-21
    • 2014-03-07
    • 2018-02-28
    • 2011-11-23
    • 2020-05-21
    • 2016-03-20
    相关资源
    最近更新 更多