代码之家  ›  专栏  ›  技术社区  ›  Bernard

pyQT QNetworkManager和ProgressBars

  •  1
  • Bernard  · 技术社区  · 17 年前

    我试图编写一些代码,从Web服务器下载一个文件并保存它,在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”永远不会被调用。。。有什么想法吗?

    1 回复  |  直到 17 年前
        1
  •  4
  •   user44484 user44484    17 年前

    您还没有将任何信号连接到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就会收到重绘事件。考虑阅读QuthTrand类,以防遇到进度条的另一个原因,因为它没有为您预先构建的解决方案。