今日长缨在手,何时缚住苍龙。这篇文章主要讲述Qt 官方示例 | 网络入门 | http 下载小工具相关的知识,希望能为你提供帮助。
哈喽,我是老吴。
最近又玩了一下 Qt,给大家分享一点 Qt 相关的基础知识吧。
我个人非常喜欢 Qt,它简直就是我这个 C++ 手残党的利器。
学习 Qt 的最佳途径应该是阅读官方的手册和示例,今天要分享的就是 Qt 官方提供的一个示例。
http 下载小工具:
文章图片
点击查看大图
源码文件:
Makefile
httpwindow.cpp
main.cpp
httpwindow.h
http.pro
下面快速地说明一下如何实现这个小工具, let\'s go.
目录:
1. 实现主界面
2. 解析 URL 和创建空文件
3. 发送 http 请求和接收 http 数据
4. 添加进度条
5. 下载完成后自动打开文件
1. 实现主界面主界面基于 QDialog,包括:
- 3 个 LineEdit;
- 1 个 CheckBox;
- 1 个 Label;
- 2 个 Button;
httpwindow.h
class HttpWindow : public QDialog
{
...
}
httpwindow.cpp
HttpWindow::HttpWindow(QWidget *parent)
: QDialog(parent)
...
{
QFormLayout *formLayout = new QFormLayout;
formLayout->
addRow(tr("&
URL:"), urlLineEdit);
formLayout->
addRow(tr("&
Download directory:"), downloadDirectoryLineEdit);
formLayout->
addRow(tr("Default &
file:"), defaultFileLineEdit);
formLayout->
addRow(launchCheckBox);
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->
addLayout(formLayout);
mainLayout->
addWidget(statusLabel);
QPushButton *quitButton = new QPushButton(tr("Quit"));
QWidget::close);
QDialogButtonBox *buttonBox = new QDialogButtonBox;
buttonBox->
addButton(downloadButton, QDialogButtonBox::ActionRole);
buttonBox->
addButton(quitButton, QDialogButtonBox::RejectRole);
mainLayout->
addWidget(buttonBox);
}
用 QFormLayout 对 3 个编辑框进行表单布局,然后再QVBoxLayout 来进行整体的垂直布局。
main.cpp:
int main(int argc, char *argv[])
{
...
HttpWindow httpWin;
httpWin.show();
...
}
运行效果:
文章图片
此时只有界面, Download 按键并没有实际的功能。
2. 解析 URL 和创建空文件当用户点击 Downaload 按键时,需要解析用户输入的 URL 并打开一个新文件用于保存将要下载的文件。
代码如下:
1. 为 Download 按键绑定槽
connect(downloadButton, &
QAbstractButton::clicked, this, &
HttpWindow::downloadFile);
}
2. 解析 URL
void HttpWindow::downloadFile()
{
// 获得 URL
const QString urlSpec = urlLineEdit->
text().trimmed();
const QUrl newUrl = QUrl::fromUserInput(urlSpec);
// 获得 文件保存路径
QString fileName = newUrl.fileName();
QString downloadDirectory = QDir::cleanPath(downloadDirectoryLineEdit->
text().trimmed());
fileName.prepend(downloadDirectory + \'/\');
}
从 URL 中提取出文件名,和下载路径拼接在一起形成完整的文件路径。
3. 创建空文件
void HttpWindow::downloadFile()
{
...
if (QFile::exists(fileName)) {
QFile::remove((fileName));
}
file = openFileForWrite(fileName);
...
}
std::unique_ptr{
std::unique_ptr;
file->
open(QIODevice::WriteOnly);
return file;
}
运行效果:
文章图片
3. 发送 http 请求和接收 http 数据
在 Qt 里,可以用 QNetworkAccessManager 发送 http request,用 QNetworkReply 保存 http reply。
class HttpWindow : public QDialog
{
private:
...
QUrl url;
QNetworkAccessManager qnam;
QNetworkReply *reply;
};
当用户按下 Download 键时,发送 http request:
void HttpWindow::startRequest(const QUrl &
requestedUrl)
{
url = requestedUrl;
reply = qnam.get(QNetworkRequest(url));
connect(reply, &
QIODevice::readyRead, this, &
HttpWindow::httpReadyRead);
connect(reply, &
QNetworkReply::finished, this, &
HttpWindow::httpFinished);
statusLabel->
setText(tr("Downloading %1...").arg(url.toString()));
}
当有数据到来时,将其写到文件中:
void HttpWindow::httpReadyRead()
{
if (file)
file->
write(reply->
readAll());
}
当数据传输完毕后,提示用户下载完毕:
void HttpWindow::httpFinished()
{
QFileInfo fi;
if (file) {
fi.setFile(file->
fileName());
file->
close();
file.reset();
}
statusLabel->
setText(tr("Downloaded %1 bytes to %2\\nin\\n%3")
.arg(fi.size()).arg(fi.fileName(), QDir::toNativeSeparators(fi.absolutePath())));
downloadButton->
setEnabled(true);
}
运行效果:
文章图片
4. 添加进度条
发送请求后,创建一个进度条。
进度条的百分比和 http reply 的数据绑定在一起:
void HttpWindow::startRequest(const QUrl &
requestedUrl)
{
...
ProgressDialog *progressDialog = new ProgressDialog(url, nullptr);
...
connect(reply, &
QNetworkReply::downloadProgress, progressDialog, &
ProgressDialog::networkReplyProgress);
...
progressDialog->
show();
}
// 更新进度条的百分比
void ProgressDialog::networkReplyProgress(qint64 bytesRead, qint64 totalBytes)
{
setMaximum(totalBytes);
setValue(bytesRead);
}
运行效果:
文章图片
5. 下载完成后自动打开文件
QDesktopServices 用于访问常见的桌面服务。
许多桌面环境都会提供一系列服务,可以通过应用程序来执行常见任务。例如以用户应用程序首选项的方式打开一个网页或者 PDF。
当下载完毕后,如果用户使能了 Launch file 选项,则打开此下载文件:
void HttpWindow::httpFinished()
{
...
if (launchCheckBox->
isChecked()) {
QDesktopServices::openUrl(QUrl::fromLocalFile(fi.absoluteFilePath()));
}
downloadButton->
setEnabled(true);
}
【Qt 官方示例 | 网络入门 | http 下载小工具】运行效果:
文章图片
到此,这个 http 下载小工具就实现完毕啦。
嘿嘿,你们会学会了吗?
相关参考https://doc.qt.io/qt-5/qtnetwork-http-example.html
思考技术,也思考人生要学习技术,更要学习如何生活。
好书推荐:
《指数基金投资指南》
作者银行螺丝钉,专注于低估值指数基金投资,系统性地讲解各类指数基金,以及投资指数基金的有效策略。
文章图片
点击查看大图
能收获什么?
- 温习了一些关于基金定投的基础知识;
觉得文章对你有价值,不妨 在看 + 分享。
推荐阅读:
专辑 | Linux 驱动开发
专辑 | 每天一点 C
专辑 | Linux 系统编程
推荐阅读
- Dynamics 365基于FetchXml的S S R S报表开发实例
- 浅析ARM公司在物联网领域的战略布局
- Qt小知识 | 用一篇小短文,带你进入 QML 的美妙世界
- 学嵌入式Linux软件开发需要的知识
- 高老师的<集装箱;思维,2008年初预测Android蓬勃发展
- 嵌入式软件工程师笔试面试指南-ARM体系与架构
- 物联网智能网关-09CAN总线通信演示(TinyGUI触屏)
- 嵌入式Linux开发环境中双网卡使用过程杂记
- Linux 驱动开发 | 驱动世界里的宏伟建筑