我正在尝试编写从Web服务器下载文件并保存它的代码,显示QProgressBar中的下载进度。 现在,有很多方法可以在常规Python中执行此操作,这很容易。问题是它锁定了progressBar的刷新。解决方案是使用PyQT的QNetworkManager类。我可以用它下载一些东西,我只是无法获得设置来显示progressBar上的进度。这是一个例子:
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”永远不会被调用......任何想法?
答案 0 :(得分: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()语法;你可以将引用传递给你的方法或函数。
更新
我只是想指出,如果你想在处理过程中GUI锁定的任何情况下使用进度条,一种解决方案是在另一个线程中运行你的处理代码,这样你的GUI就会收到重绘事件。考虑阅读QThread类,以防您遇到没有为您预先构建解决方案的进度条的另一个原因。