2012-06-13 2 views
0

Я работаю над проектом, в котором мне нужно загрузить и проанализировать XML-файл из сетевого местоположения. Я пытаюсь использовать модуль QtNetwork для выполнения этого, но я столкнулся с кажущейся простой проблемой, которую я потратил много часов, пытаясь решить. Мой код выглядит следующим образом:PyQt Unbound Method При передаче аргумента между сигналом и слотом

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)