2012-06-13 36 views
0

我正在開發一個項目,我需要從網絡位置下載和解析XML文件。我一直在嘗試使用QtNetwork模塊來完成這個任務,但我遇到了一個看似簡單的問題,我花了很多時間試圖解決這個問題。我的代碼如下:當在信號和插槽之間傳遞參數時PyQt未綁定方法

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對象的實例化實例從一個信號傳遞給一個插槽嗎?

謝謝。

+0

沒關係,我已經想通了。完成的信號並未在我的程序中發出,但是當我按照我所做的方式指定插槽時,將立即調用插槽方法並將一個未經實例化的QNetworkReply對象傳遞給該方法。 所以現在又提出了另一個問題:爲什麼完成的標誌不被提出?該文件的長度只有幾千字節,我確定地址是正確的。該文件每秒鐘都在更新,但是,我認爲這與它沒有任何關係。 –

回答

0

只是通過它的插槽中,QNetworkReply對象將打通信號通過的:

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