pyQT QNetworkManager 和进度条
我正在尝试编写一个程序,从网络服务器下载文件并保存,同时在一个进度条(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类,以防你遇到其他需要进度条的情况,而没有现成的解决方案。