在 Signal 和 Slot 之间传递参数时的 PyQt Unbound 方法

Posted

技术标签:

【中文标题】在 Signal 和 Slot 之间传递参数时的 PyQt Unbound 方法【英文标题】:PyQt Unbound Method When Passing Argument Between Signal and Slot 【发布时间】:2012-06-13 15:58:09 【问题描述】:

我正在做一个项目,我需要从网络位置下载和解析 XML 文件。我一直在尝试使用 QtNetwork 模块来完成此任务,但我遇到了一个看似简单的问题,我花了很多时间试图解决这个问题。我的代码如下:

class NetworkAccessor(QObject):
    done = False
    def importXml(self):
        self.manager = QNetworkAccessManager()
        self.manager.finished.connect(self.fileReady(QNetworkReply))
        self.manager.get(QNetworkRequest(QUrl("http://192.168.5.243/details.xml")))

    def fileReady(self, response):
        self.f = QTemporaryFile()
        print type(response)
        self.f.write(response.readAll())
        self.done = True
        print "Done"

当我实例化 NetworkAccessor 类并调用 importXml 时,我收到以下错误:

Traceback (most recent call last): File "C:/SVN-Local/Thermal/PyQtTestTemplate.py", line 40, in updateUi f = networkAccessor.importXml() File "C:/SVN-Local/Thermal/PyQtTestTemplate.py", line 14, in importXml self.connect(self.manager,SIGNAL("finished(QNetworkReply*)"),self.fileReady(QNetworkReply)) File "C:/SVN-Local/Thermal/PyQtTestTemplate.py", line 20, in fileReady self.f.write(response.readAll()) TypeError: QIODevice.readAll(): first argument of unbound method must have type 'QIODevice'

似乎表明传递给fileReady方法的参数没有被实例化。此外,上面的print type(response) 语句表明response 的类型为PyQt4.QtNetwork.QNetworkReply

我尝试了各种将信号连接到插槽的方法,包括“老式”方法:self.connect(self.manager,SIGNAL("finished(QNetworkReply*)"),self.fileReady("QNetworkReply")) 以及使用短路参数传递但没有成功。

有人可以告诉我将 QNetworkReply 对象的实例化实例从信号传递到插槽的正确方法吗?

谢谢。

【问题讨论】:

没关系,我已经想通了。在我的程序中没有发出完成的信号,但是当我以我所做的方式指定槽时,槽方法被立即调用并将一个未实例化的 QNetworkReply 对象传递给该方法。所以现在提出了另一个问题:为什么没有升起完成的标志?该文件只有几千字节的长度,我确定地址是正确的。但是,该文件大约每秒更新一次,但我认为这与它没有任何关系。 【参考方案1】:

只需将槽传递给它,QNetworkReply 对象就会被信号传递:

self.manager.finished.connect(self.fileReady)

【讨论】:

以上是关于在 Signal 和 Slot 之间传递参数时的 PyQt Unbound 方法的主要内容,如果未能解决你的问题,请参考以下文章

通过 Signal/Slot 机制将 QString 传递给 QThread

为啥我的数据不能在带有 SIGNAl/SLOT 的表格之间传输?

详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)

QT 用比 SLOT 更少的参数连接一个 SIGNAL

Signal和Slot是同步的还是异步的

使用重载的 PySide 信号调用 Python 函数而不传递参数