pyQT QNetworkManager и ProgressBars - PullRequest
1 голос
/ 17 апреля 2009

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

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

1 Ответ

4 голосов
/ 18 апреля 2009

Ну, вы не подключили ни один из сигналов к вашему методу 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 (); Вы можете просто передать ссылку на ваш метод или функцию.

Обновление:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...