pyQT QNetworkManager 和进度条

1 投票
1 回答
2940 浏览
提问于 2025-04-15 11:09

我正在尝试编写一个程序,从网络服务器下载文件并保存,同时在一个进度条(QProgressBar)上显示下载进度。
在普通的Python中,有很多方法可以做到这一点,而且很简单。问题是,这样会导致进度条无法刷新。解决办法是使用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”从来没有被调用过……有什么想法吗?

1 个回答

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()这种语法;你只需要把方法或函数的引用传进去就可以了。

更新:

我想提醒你,如果你在处理某些事情时,界面会卡住,而你又想使用进度条,一个解决办法是把处理的代码放到另一个线程里,这样你的界面就能继续接收重绘事件。可以考虑了解一下QThread类,以防你遇到其他需要进度条的情况,而没有现成的解决方案。

撰写回答