2009-04-17 2 views
1

Я пытаюсь закодировать что-то, что загружает файл с веб-сервера и сохраняет его, показывая ход загрузки в QProgressBar. Теперь есть способы сделать это в обычном Python, и это легко. Проблема в том, что он блокирует обновление progressBar. Решение состоит в использовании класса QNetworkManager PyQT. Я могу скачать материал просто отлично, я просто не могу настроить, чтобы показать прогресс на progressBar. Here's пример:pyQT QNetworkManager и ProgressBars

class Form(QDialog): 

    def __init__(self,parent=None): 
     super(Form,self).__init__(parent) 
     self.progressBar = QProgressBar() 
     self.reply = None 
     layout = QHBoxLayout() 
     layout.addWidget(self.progressBar) 
     self.setLayout(layout) 
     self.manager = QNetworkAccessManager(self) 
     self.connect(self.manager,SIGNAL("finished(QNetworkReply*)"),self.replyFinished) 
     self.Down() 

    def Down(self): 

     address = QUrl("http://stackoverflow.com") #URL from the remote file. 
     self.manager.get(QNetworkRequest(address)) 
    def replyFinished(self, reply): 
     self.connect(reply,SIGNAL("downloadProgress(int,int)"),self.progressBar, SLOT("setValue(int)")) 
     self.reply = reply 
     self.progressBar.setMaximum(reply.size()) 
     alltext = self.reply.readAll() 
     #print alltext 
     #print alltext 
    def updateBar(self, read,total): 
     print "read", read 
     print "total",total 
     #self.progressBar.setMinimum(0) 
     #self.progressBar.setMask(total) 
     #self.progressBar.setValue(read) 

В этом случае, мой метод "updateBar" никогда не называют ... какие-нибудь идеи?

ответ

4

Ну, вы не подключили ни один из сигналов к вашему методу updateBar().

изменение

def replyFinished(self, reply): 
     self.connect(reply,SIGNAL("downloadProgress(int,int)"),self.progressBar, SLOT("setValue(int)")) 

в

def replyFinished(self, reply): 
     self.connect(reply,SIGNAL("downloadProgress(int,int)"),self.updateBar) 

Обратите внимание, что в Python не должны явно использовать синтаксис SLOT(); вы можете просто передать ссылку на свой метод или функцию.

Update:

Я просто хотел бы отметить, что если вы хотите использовать Прогресс бар в любой ситуации, когда ваш GUI зависает во время обработки, одно решение для запуска кода обработки в другом потоке, чтобы ваш GUI получает события перерисовки. Подумайте о том, как читать класс QThread, если вы столкнулись с другой причиной для индикатора выполнения, у которого нет предварительно построенного решения для вас.

Смежные вопросы