【Pyqt4 实例21】实现http下载

来源:互联网 发布:java工厂方法设计模式 编辑:程序博客网 时间:2024/06/04 19:15
# -*- coding: utf-8 -*-from PyQt4.QtGui import *from PyQt4.QtCore import *import sysfrom PyQt4.QtNetwork import *QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))class HttpClient(QDialog):    def __init__(self,parent=None):        super(HttpClient,self).__init__(parent)        self.setWindowTitle(self.tr("实现Http文件下载"))          vbMain = QVBoxLayout(self)                hb1 = QHBoxLayout()        LabelName = QLabel(self)        LabelName.setText(self.tr("地址:"))        self.LineEditUser = QLineEdit(self)        hb1.addWidget(LabelName)        hb1.addWidget(self.LineEditUser)                self.progressBar=QProgressBar()                 hb2 = QHBoxLayout()                hb2.addWidget(self.progressBar)                hb3 = QHBoxLayout()                self.PushButtonDown = QPushButton(self)        self.PushButtonDown.setText(self.tr("下载"))                self.PushButtonCancel = QPushButton(self)        self.PushButtonCancel.setText(self.tr("取消"))        self.PushButtonExit = QPushButton(self)        self.PushButtonExit.setText(self.tr("退出"))                hb3.addWidget(self.PushButtonDown)        hb3.addWidget(self.PushButtonCancel)        hb3.addWidget(self.PushButtonExit)                vbMain.addLayout(hb1)        vbMain.addLayout(hb2)        vbMain.addLayout(hb3)                self.httpClient = QHttp(self)                self.connect(self.httpClient,SIGNAL("requestFinished(int,bool)"),self.httpRequestFinished)        self.connect(self.httpClient,SIGNAL("dataReadProgress(int,int)"),self.httpDataReadProcess)        self.connect(self.httpClient,SIGNAL("responseHeaderReceived()"),self.httpResponseHeaderReceived)        self.connect(self.PushButtonCancel,SIGNAL("clicked()"),self.slotCancel)        self.connect(self.PushButtonDown,SIGNAL("clicked()"),self.slotDownload)        self.connect(self.PushButtonExit,SIGNAL("clicked()"),self.slotExit)                self.PushButtonCancel.setEnabled(False)
    def slotDownload(self):        url = QUrl(self.LineEditUser.text())        fileInfo = QFileInfo(url.path())        fileName = fileInfo.fileName()        if QFile.exists(fileName):            QMessageBox.information(self,self.tr("Error"),self.tr("File already exists!"))            return        self.file = QFile(fileName)        if not self.file.open(QIODevice.WriteOnly):            QMessageBox.information(self,self.tr("Error"),self.tr("Save file error!"))            self.file = 0            return        url_port = url.port()          if url_port == -1:            url_port = 80        self.httpClient.setHost(url.host(),url_port)        if not url.userName().isEmpty():            self.httpClient.setUser(url.userName(),url.userPassword())        self.httpRequestAborted = False        self.requestId = self.httpClient.get(url.path(),self.file)        self.progressBar.reset()        self.PushButtonDown.setEnabled(False)        self.PushButtonCancel.setEnabled(True)            def httpRequestFinished(self,id,error):        if self.httpRequestAborted:            if self.file:                self.file.close()                self.file.remove()                self.file = 0            self.progressBar.reset()            return        if id == self.requestId:            self.progressBar.reset()            self.file.close()            if error:                self.file.remove()                QMessageBox.information(self,self.tr("Error"),self.tr("Download failed!"))            self.PushButtonDown.setEnabled(True)            self.PushButtonCancel.setEnabled(False)            self.file = 0        def httpDataReadProcess(self,done,total):        self.progressBar.setMaximum(total)        self.progressBar.setValue(done)        def httpResponseHeaderReceived(self,responseHeader):        if responseHeader.statusCode != 200 :            QMessageBox.infomation(self,self.tr("Error"),self.tr("Download error!"))            self.httpRequestAborted = True            self.progressBar.reset()            self.httpClient.abort()            return        def slotCancel(self):        self.httpRequestAborted = True        self.httpClient.abort()        self.PushButtonDown.setEnabled(True)        self.PushButtonCancel.setEnabled(False)        def slotExit(self):        self.close()app=QApplication(sys.argv)dialog=HttpClient()dialog.show()app.exec_()

0 0
原创粉丝点击