Qt 官方示例

2023-11-16

哈喽,我是老吴。

最近又玩了一下 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<QFile> HttpWindow::openFileForWrite(const QString &fileName)
{
    std::unique_ptr<QFile> file(new QFile(fileName));
    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);
}

运行效果:

到此,这个 http 下载小工具就实现完毕啦。

嘿嘿,你们会学会了吗?

相关参考

https://doc.qt.io/qt-5/qtnetwork-http-example.html

思考技术,也思考人生

要学习技术,更要学习如何生活

好书推荐:

《指数基金投资指南》

作者银行螺丝钉,专注于低估值指数基金投资,系统性地讲解各类指数基金,以及投资指数基金的有效策略。

点击查看大图

能收获什么?

  • 温习了一些关于基金定投的基础知识;

你和我各有一个苹果,如果我们交换苹果的话,我们还是只有一个苹果。但当你和我各有一个想法,我们交换想法的话,我们就都有两个想法了。

觉得文章对你有价值,不妨 在看 + 分享

推荐阅读:

专辑 | Linux 驱动开发

专辑 | 每天一点 C

专辑 | Linux 系统编程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 官方示例 的相关文章

  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • 如何延迟加载嵌入在 iframe 上的 YouTube 视频?

    如何将延迟加载应用于iframe嵌入视频 我尝试添加loading eager loading auto and loading lazyload 您可以使用srcdoc你里面的属性iframe标签来加载图像 请参阅以下示例作为参考
  • 在d3.js中将2D形状转换为3D,并根据ANGULAR中的值调整高度

    我正在使用 d3 js v6 创建以下 2D 图表表示的 3D 图表 这个圆圈中有多个正方形 每个正方形都根据值分配了一种颜色 值越大 正方形越暗 现在我想将其转换为 3D 形状 其中当值变高时 只有特定正方形的高度会增加 因此结果在某种程
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 逃离的正确方法是什么?使用 Oracle 12c MATCH_RECOGNIZE 时 JDBCPreparedStatement 中的字符?

    以下查询在 Oracle 12c 中是正确的 SELECT FROM dual MATCH RECOGNIZE MEASURES a dummy AS dummy PATTERN a DEFINE a AS 1 1 但它不能通过 JDBC
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 使用 JS 合并具有相同值的相邻 HTML 表格单元格

    我已经为此苦苦挣扎了一段时间 我有一个根据一些 JSON 数据自动生成的表 该数据可能会有所不同 我想合并第一列中具有相同值的相邻单元格 例如此表中的 鱼 和 鸟 table tr td fish td td salmon td tr tr
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 我可以停止 :hover 应用于元素吗?

    假设我有一些 CSS button hover font weight bold 我怎样才能防止 hover随意应用样式 我的目标用例是当元素被禁用时 例如 使用这个 HTML
  • JSTL 在循环中每 5 个字段集创建一个新行

    您好 我目前正在迭代并在表中显示字段集列表 为了让布局变得更得体一些 我想在每次循环到达第五个字段集时创建一个新行 谢谢 JSP div class det table class det tr td td tr table div
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi

随机推荐

  • Ubuntu16.04安装搜狗输入法 详细教程

    由于自己也是一个刚入门Ubuntu的新手 对很多终端命令 软件的安装都不大了解 这里记录一下Linux版本的搜狗输入法 一开始觉着有个中文版的系统自带的输入法挺好的 结果没有想到拼音确实不是很好用 就根据这篇教程安装好了Linux版本的搜狗
  • Faster RCNN详解

    paper Faster R CNN Towards Real Time Object Detection with Region Proposal Networks Tensorflow faster r cnn github Tenso
  • VUE经典面试题

    vue2 0的实现原理 vue数据双向绑定是通过数据劫持结合发布者订阅模式来实现的 也就是说数据层和视图层同步 数据层发生变化 视图跟着变化 视图变化数据也跟着随之发生变化 第一步 需要observe的数据对象进行递归遍历 第二步 comp
  • mysql 触发器

    触发器 当对某张表进行 INSERT DELETE UPDATE 操作时 会自动触发定义的触发器中的操作 顾名思义 当我们为某张表定义触发器后 向表中添加 删除 修改数据时 会触发触发器中定义的操作 触发器像是一个事件的监听 一旦监听的事件
  • springboot校园二手物品交易平台 毕业设计源码03373

    目 录 摘要 1 绪论 1 1 研究背景 1 2国内外研究现状 1 3论文结构与章节安排 2平台分析 2 1 可行性分析 2 2 系统流程分析 2 2 1 数据流程 3 3 2 业务流程 2 3 系统功能分析 2 3 1 功能性分析 2 3
  • 大数据标准化白皮书(2020版) 附下载地址

    大数据是新时代最重要的 数字金矿 是全球数字经济发展的核心动能 数据资源如同农业时代的土地 劳动力 工业时代的技术 资本 已经成为信息 时代重要的基础性战略资源和关键生产要素 是推动经济发展质量变革 效率变 革 动力变革的新引擎 不断驱动人
  • python爬取推特图片_twitter图片视频批量下载

    import requests import re from urllib request import urlretrieve import os import ssl ssl create default https context s
  • 试看5分钟视频python_Python面试应急5分钟!

    不论你是初入江湖 还是江湖老手 只要你想给自己一个定位那就少不了面试 面试的重要性相信大家都知道把 这就是我们常说的 第一印象 给大家说一下我的面试心得把 面试前的紧张是要的 因为这能让你充分准备 面试时的紧张是绝对要避开的 因为这可能导致
  • open source 3d map_3D视觉技术在机器人抓取作业中的应用实例

    原标题 3D视觉技术在机器人抓取作业中的应用实例 关键词 3D视觉 工业机器人 抓取 1 引言 3D视觉技术作为新兴的技术领域还存在很多亟待解决的问题 但2D视觉已不能满足空间抓取的应用要求 与2D视觉相比 3D视觉技术的优点有 1 3D视
  • C++ 创建桌面快捷方式

    include
  • 白盒测试——基本路径测试

    基本路径测试是将程序流程图转化为控制流图 通过分析控制结构的环路复杂性 进而找出路径的基本独立集 最终导出测试用例 基本独立集 从基本独立集导出的测试用例保证对程序中的每一条语句至少执行一次 控制流图 定义 百度百科 是一个过程或程序的抽象
  • 若依开关使用

  • OpenLayers 6加载各种地图源的方法(天地图、百度、高德、ArcGIS、Bing、OSM、Google等)

    前言 OpenLayers是一个用于开发WebGIS客户端的JavaScript包 OpenLayers 支持多种常用的地图来源 包括天地图 百度地图 高德地图 ArcGIS地图 Bing地图 OSM地图 Google地图等 一 加载天地图
  • 3D游戏编程——空间与运动

    3D游戏编程 空间与运动 1 简答并用程序验证 游戏对象运动的本质是什么 答 游戏对象运动的本质就是使用矩阵变换 平移 旋转 缩放 改变游戏对象的空间属性 我们做的游戏关键就是游戏对象在每一帧图像上怎么变换 最直观的就是观察我们每个对象的T
  • CSS SASS 外部引入的scss文件中,不能用嵌套写法

    小记录 在vue文件中引入scss文件中 不能正常使用sass语法 发现是引入方式的问题
  • 【自我提升】Spring Data JPA之Specification动态查询详解

    写在前面 刷完Spring Data JPA的课后 发现Specification动态查询还挺有意思的 还应用到了规约设计模式 在此记录下学习过程和见解 目录 一 应用场景 二 源码解析 三 规约模式 四 实际应用 一 应用场景 1 简介
  • 云数据库知识学习——概述

    一 云计算是云数据库兴起的基础 云计算是分布式计算 并行计算 效用计算 网络存储 虚拟化 负载均衡等计算机和网络技术发展融合的产物 云计算是由一系列可以动态升级和被虚拟化的资源组成的 用户无需掌握云计算的技术 只要通过网络就可以访问这些资源
  • function XX declared implicitly

    stm32 keilMDK出现warning function XX declared implicitly 原创 2014年08月26日 14 50 47 26281 warning 223 D function CLR TX DATA
  • 枚举类,属性循环---(枚举类循环)通过名称取值

    代码示例 public enum DomeEnum AA 1 张三 BB 2 李四 CC 3 王五 DD 4 赵六 EE 5 李七 private Integer code private String name DomeEnum Inte
  • Qt 官方示例

    哈喽 我是老吴 最近又玩了一下 Qt 给大家分享一点 Qt 相关的基础知识吧 我个人非常喜欢 Qt 它简直就是我这个 C 手残党的利器 学习 Qt 的最佳途径应该是阅读官方的手册和示例 今天要分享的就是 Qt 官方提供的一个示例 http