⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7.12 实例:http客户端.txt

📁 qt的源代码
💻 TXT
字号:
#ifndef HTTPWINDOW_H
 #define HTTPWINDOW_H
 #include <QDialog>
 class QDialogButtonBox;
 class QFile;
 class QHttp;
 class QHttpResponseHeader;
 class QLabel;
 class QLineEdit;
 class QProgressDialog;
 class QPushButton;
 class QSslError;
 class QAuthenticator;
 class HttpWindow : public QDialog
 {
     Q_OBJECT
 public:
     HttpWindow(QWidget *parent = 0);
 private slots:
     void downloadFile();
 /*下载文件函数*/ 
     void cancelDownload();
 /*退出下载*/
     void httpRequestFinished(int requestId, bool error);
 /*http请求结束*/
     void readResponseHeader(const QHttpResponseHeader &responseHeader);
void updateDataReadProgress(int bytesRead, int totalBytes);
     void enableDownloadButton();
     void slotAuthenticationRequired(const QString &, quint16, QAuthenticator *);
 #ifndef QT_NO_OPENSSL
     void sslErrors(const QList<QSslError> &errors);
 #endif
 private:
     QLabel *statusLabel;
     QLabel *urlLabel;
     QLineEdit *urlLineEdit;
     QProgressDialog *progressDialog;
     QPushButton *downloadButton;
     QPushButton *quitButton;
     QDialogButtonBox *buttonBox;
     QHttp *http;
     QFile *file;
     int httpGetId;
     bool httpRequestAborted;
 };
 #endif
 #include <QtGui>
 #include <QtNetwork>
 #include "httpwindow.h"
 #include "ui_authenticationdialog.h"
 HttpWindow::HttpWindow(QWidget *parent)
     : QDialog(parent)
 {
 #ifndef QT_NO_OPENSSL
 urlLineEdit = new QLineEdit("https://");
 #else
     urlLineEdit = new QLineEdit("http://");
 #endif
  urlLabel = new QLabel(tr("&URL:"));
     urlLabel->setBuddy(urlLineEdit);
     statusLabel = new QLabel(tr("Please enter the URL of a file you want to 
                                 "download."));
     downloadButton = new QPushButton(tr("Download"));
     downloadButton->setDefault(true);
     quitButton = new QPushButton(tr("Quit"));
     quitButton->setAutoDefault(false);
     buttonBox = new QDialogButtonBox;
     buttonBox->addButton(downloadButton, QDialogButtonBox::ActionRole);
     buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);
     progressDialog = new QProgressDialog(this);
     http = new QHttp(this);
 connect(urlLineEdit, SIGNAL(textChanged(const QString &)),
       this, SLOT(enableDownloadButton()));
 connect(http, SIGNAL(requestFinished(int, bool)),
       this, SLOT(httpRequestFinished(int, bool)));
 connect(http, SIGNAL(dataReadProgress(int, int)),
       this, SLOT(updateDataReadProgress(int, int)));
 connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)),
       this, SLOT(readResponseHeader(const QHttpResponseHeader &)));
 connect(http, SIGNAL(authenticationRequired(const QString &, quint16, QAuthenticator *)),
       this, SLOT(slotAuthenticationRequired(constQString &, quint16, QAuthenticator *)));
 #ifndef QT_NO_OPENSSL
     connect(http, SIGNAL(sslErrors(const QList<QSslError> &)),
             this, SLOT(sslErrors(const QList<QSslError> &)));
 #endif
     connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelDownload()));
     connect(downloadButton, SIGNAL(clicked()), this, SLOT(downloadFile()));
     connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
 QHBoxLayout *topLayout = new QHBoxLayout;
     topLayout->addWidget(urlLabel);
     topLayout->addWidget(urlLineEdit);
     QVBoxLayout *mainLayout = new QVBoxLayout;
     mainLayout->addLayout(topLayout);
     mainLayout->addWidget(statusLabel);
     mainLayout->addWidget(buttonBox);
     setLayout(mainLayout);
 setWindowTitle(tr("HTTP"));
     urlLineEdit->setFocus();
 }
 void HttpWindow::downloadFile()
 {
     QUrl url(urlLineEdit->text());
  QFileInfo fileInfo(url.path());
 QString fileName = fileInfo.fileName();
     if (fileName.isEmpty())
         fileName = "index.html";
 if (QFile::exists(fileName)) {
         if (QMessageBox::question(this, tr("HTTP"),
                                   tr("There already exists a file called %1 in "
                                      "the current directory. Overwrite?").arg(fileName),
                                   QMessageBox::Ok|QMessageBox::Cancel, QMessageBox::Cancel)
             == QMessageBox::Cancel)
             return;
         QFile::remove(fileName);
     }
     file = new QFile(fileName);
     if (!file->open(QIODevice::WriteOnly)) {
    QMessageBox::information(this, tr("HTTP"),
                                  tr("Unable to save the file %1: %2.")
                                  .arg(fileName).arg(file->errorString()));
         delete file;
         file = 0;
         return;
     }
  QHttp::ConnectionMode mode=url.scheme().toLower()=="https" ? QHttp::ConnectionModeHttps : QHttp::ConnectionModeHttp;
     http->setHost(url.host(), mode, url.port() == -1 ? 0 : url.port());
     if (!url.userName().isEmpty())
         http->setUser(url.userName(), url.password());
     httpRequestAborted = false;
     QByteArray path = QUrl::toPercentEncoding(url.path(), "!$&'()*+,;=:@/");
     if (path.isEmpty())
         path = "/";
     httpGetId = http->get(path, file);
     progressDialog->setWindowTitle(tr("HTTP"));
     progressDialog->setLabelText(tr("Downloading %1.").arg(fileName));
 downloadButton->setEnabled(false);
 }
 void HttpWindow::cancelDownload()
 {
     statusLabel->setText(tr("Download canceled."));
     httpRequestAborted = true;
     http->abort();
     downloadButton->setEnabled(true);
 }
 void HttpWindow::httpRequestFinished(int requestId, bool error)
 {
     if (requestId != httpGetId)
         return;
     if (httpRequestAborted) {
         if (file) {
             file->close();
             file->remove();
             delete file;
             file = 0;
         }
         progressDialog->hide();
         return;
     }
     if (requestId != httpGetId)
         return;
     progressDialog->hide();
     file->close();
     if (error) {
         file->remove();
         QMessageBox::information(this, tr("HTTP"),
                                  tr("Download failed: %1.")
                                  .arg(http->errorString()));
     } else {
         QString fileName = QFileInfo(QUrl(urlLineEdit->text()).path()).fileName();
         statusLabel->setText(tr("Downloaded %1 to current directory.").arg(fileName));
     }
     downloadButton->setEnabled(true);
     delete file;
     file = 0;
 }
 void HttpWindow::readResponseHeader(const QHttpResponseHeader &responseHeader)
 {
     switch (responseHeader.statusCode()) {
     case 200:                
  case 301:                   
     case 302: 
 case 303:
 case 307: 
 break;
     default:
         QMessageBox::information(this, tr("HTTP"),
                                  tr("Download failed: %1.")
                                  .arg(responseHeader.reasonPhrase()));
         httpRequestAborted = true;
         progressDialog->hide();
         http->abort();
     }
 }
 void HttpWindow::updateDataReadProgress(int bytesRead, int totalBytes)
 {
     if (httpRequestAborted)
         return;
     progressDialog->setMaximum(totalBytes);
     progressDialog->setValue(bytesRead);
}
 void HttpWindow::enableDownloadButton()
 {
     downloadButton->setEnabled(!urlLineEdit->text().isEmpty());
}
 void HttpWindow::slotAuthenticationRequired(const QString &hostName, quint16, QAuthenticator *authenticator)
 {
   QDialog dlg;
   Ui::Dialog ui;
   ui.setupUi(&dlg);
   dlg.adjustSize();
   ui.siteDescription->setText(tr("%1 at %2").arg(authenticator->realm()).arg(hostName));
  if (dlg.exec() == QDialog::Accepted) {
      authenticator->setUser(ui.userEdit->text());
      authenticator->setPassword(ui.passwordEdit->text());
 }
 }
 #ifndef QT_NO_OPENSSL
 void HttpWindow::sslErrors(const QList<QSslError> &errors)
 {
     QString errorString;
     foreach (const QSslError &error, errors) {
         if (!errorString.isEmpty())
             errorString += ", ";
         errorString += error.errorString();
     }
     if (QMessageBox::warning(this, tr("HTTP Example"),
     tr("One or more SSL errors has occurred: %1").arg(errorString),
     QMessageBox::Ignore | QMessageBox::Abort) == QMessageBox::Ignore) {
         http->ignoreSslErrors();
     }
 }
 #endif
#include <QApplication>
 #include "httpwindow.h"
 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     HttpWindow httpWin;
     httpWin.show();
     return httpWin.exec();
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -