pyQT QNetworkManager и ProgressBars

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

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 никогда не вызывается... есть идеи?


person Community    schedule 17.04.2009    source источник


Ответы (1)


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

сдача

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

to

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

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

Обновлять:

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

person Community    schedule 18.04.2009