Qt之QUrlQuery

简述

QUrlQuery 类提供了一种方法来操纵 URL 查询中的 key-value 对。

  • 简述
  • 详细描述
    • 编码
    • 处理空格和加号
    • 全解码
    • 非标准分隔符
  • 使用
    • QUrlQuery
    • 分隔符
    • 查询
    • 删除
    • 是否为空

详细描述

QUrlQuery 用来解析 URL 中的查询字符串,像下面这样:

上述的查询字符串在 URL 中 被用来传输选项,通常解码为多个 key-value 对。其列表包含了的两个条目,键为“type”和 “color”。QUrlQuery 也适用于从查询的各个组成部分创建一个查询字符串,为了 在 QUrl::setQuery() 中使用。

解析一个查询字符串最常见的方式是在构造函数中始化它,通过传递一个查询字符串。否则,可以使用 setQuery() 函数来设置要解析的查询。该函数也可用于解析具有非标准分割符的查询,在设置它们之后使用 setQueryDelimiters() 函数。

编码的查询字符串可以再次使用 query() 获得,这需要所有的内部存储项,并使用分隔符编码字符串。

编码

QUrlQuery 中的所有 getter 函数均支持一个可选参数QUrl::ComponentFormattingOptions 类型,包括 query(),它决定如何编码数据。除了 QUrl::FullyDecoded,返回值必须被视为一个百分比编码字符串。由于某些值不能在解码形式(如控制字符,字节序列不能被解码为 UTF-8)来表达。出于这个原因,百分比字符总是由字符串“%25”表示。

处理空格和加号 (“+”)

空格应该被编码成加号 ("+"),而如果字符本身就是加号 ("+"),则应该被编码成百分比编码格式 (%2B)然而,互联网规范管理 URL 不认为空格和加号字符等价。

由于这样,QUrlQuery 不会将空格字符编码为 "+",也不会将 "+" 解码为一个空格字符。相反,空格字符将在编码形式中呈现 "%20"

为了支持这样的 HTML 表单编码,QUrlQuery 既不会将 "%2B" 序列解码为一个加号,也不会编码一个加号。事实上,任何键、值、查询字符串中的 "%2B""+" 序列完全像写的一样 (除了 "%2b""%2B" 大写转换)。

全解码

使用 QUrl:: FullyDecoded 格式化,所有百分比编码序列将被完全解码,并且 '%' 字符用于表示本身。应小心使用 QUrl::FullyDecoded,因为可能会导致数据丢失。

这种格式化模式应该只在这种情况下使用:当在不期望百分比编码的上下文中处理呈献给用户的文本时。

注意: QUrlQuery setters 和 query 函数不支持对应 QUrl::DecodedMode 解析,所以使用 QUrl::FullyDecoded 获得 keys 列表可能导致在对象不能找到 keys 。

非标准分隔符

默认情况下,QUrlQuery 使用等号 ("=") 来分隔 key 和 value,符号 ("&") 分割彼此的 key-value 对 。通过调用 setQueryDelimiters(),可以改变 QUrlQuery 用于解析和重构查询的分隔符。

非标准分隔符在 RFC 3986 的“sub-delimiters”中:

sub-delims = “!” / “$” / “&” / “’” / “(” / “)”
/ “*” / “+” / “,” / “;” / “=”

不支持使用其他字符,可能会导致意外的行为。QUrlQuery 不验证是否传递了一个有效的分隔符。

使用

想必大家对知乎都很熟悉了,假如我们要搜索关于“Qt”的相关内容,通常会在搜索栏中输入关键字“Qt”,然后点击【搜索】按钮进行查找。

这时,观察浏览器中的网址,URL 如下:

http://www.zhihu.com/search?type=content&q=Qt

如果要构造一个这样的 URL,按照传统方式,一般是手动拼接字符串:

// 基本 URL
QString baseUrl = "http://www.zhihu.com/search?";

// 设置发送的数据
QByteArray bytes;
bytes.append("type=content&");
bytes.append(QString("q=%1").arg("Qt"));  // Qt 作为变量输入

// 组合 URL
baseUrl += bytes;

QUrl url(baseUrl);

qDebug() << url;

显然可以实现,但相比之下,QUrlQuery 更为简单、方便。而且QUrlQuery 还提供了很多其他便利的接口。

QUrlQuery

使用 addQueryItem:

// 基本 URL
QString baseUrl = "http://www.zhihu.com/search";
QUrl url(baseUrl);

// key-value 对
QUrlQuery query;
query.addQueryItem("type", "content");
query.addQueryItem("q", "Qt");

url.setQuery(query);

qDebug() << url;

使用 setQueryItems:

// 基本 URL
QString baseUrl = "http://www.zhihu.com/search";
QUrl url(baseUrl);

QUrlQuery query;

// key-value 对
QPair<QString, QString> pair;
pair.first = "type";
pair.second = "content";

QPair<QString, QString> pair2;
pair2.first = "q";
pair2.second = "Qt";

QList<QPair<QString, QString> > items;
items << pair << pair2;

query.setQueryItems(items);
url.setQuery(query);

qDebug() << url;

使用 setQuery:

// 基本 URL
QString baseUrl = "http://www.zhihu.com/search";
QUrl url(baseUrl);

// 查询字符串
QUrlQuery query;
query.setQuery("type=content&q=Qt");

url.setQuery(query);

qDebug() << url;

分隔符

默认情况下,各个 key-value 对之间的分隔符为 '&',而 key-value 之间的分隔符为 '='

QChar pair = query.queryPairDelimiter();  // '&'
QChar value = query.queryValueDelimiter();  // '='

如果要改变默认的分隔符,使用 setQueryDelimiters():

query.setQueryDelimiters('(', ')');

这时,URL 就会变为这样:

QUrl(“http://www.zhihu.com/search?type(content)q(Qt“)

查询

查询所有的 key-value 对:

QList<QPair<QString, QString> > list = query.queryItems();
// (QPair("type","content"), QPair("q","Qt"))

查询指定 key 对应的 value:

QString value = query.queryItemValue("q");
// "Qt"

查询 key-value 对合并的字符串:

QString queryString = url.query();
// "type=content&q=Qt"

查询指定 key 是否存在:

bool exist = query.hasQueryItem("q");
// true

如果存在返回 true, 否则返回 false.

删除

删除指定 key 对应的 key-value 对:

query.removeQueryItem("q");

清空当前存储的所有 key-value 对:

query.clear();

是否为空

如果 QUrlQuery 对象不包含 key-value 对,则返回 true;否则,返回 false。

query.isEmpty();
时间: 2024-09-14 06:44:09

Qt之QUrlQuery的相关文章

《Qt 实战一二三》

简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的状态,来开始每一天的点滴分享,我们是一个有激情,有态度的部队. 但是我们还是我们,我们只是多了一份责任.古语有云:"不积跬步无以至千里,不积小流无以成江海",所以每一个伟大事务的产生都不是一蹴而就的.现在我们要立足眼下,把第一站放在地球,"<Qt 实战一二三>&quo

Qt之QUrl

简述 QUrl 类提供了一个方便的接口使用 URLs. 它可以解析和构造编码和未编码形式的 URLs.QUrl 也支持国际化域名(IDNs). 简述 详细描述 错误检查 字符转换 URL格式 scheme Authority user info path query fragment 深入使用 相对路径 用户输入 文件名 主机端口 本地文件 百分比编码 有效性 详细描述 最常见的使用QUrl 的方式是通过构造函数来初始化,传递一个 QString 参数. QUrl url("https://gi

Qt之高级网络操作(HTTP/FTP快速上手)

简述 Qt Network 模块中提供了一些高级别的类,例如:QNetworkRequest.QNetworkReply 和 QNetworkAccessManager,使用常见的协议执行网络操作. 在分享的过程中,顺便介绍下 Fiddler,便于我们调试.Fiddler 是一个 HTTP 协议调试代理工具.当然,也可以使用其它 Web/HTTP 调试工具. 简述 HTTP 消息结构 支持的协议 请求 传递 URL 参数 代理 更加复杂的 POST 请求 定制请求头 响应内容 响应状态码 响应头

Qt之QNetworkProxy(网络代理)

简述 QNetworkProxy类提供了一个网络层代理. QNetworkProxy提供了配置网络层代理支持Qt网络类的方法.目前支持的类有QAbstractSocket.QTcpSocket.QUdpSocket.QTcpServer和QNetworkAccessManager. 简述 介绍 网络请求 设置代理 效果 源码 介绍 代理被设计的尽可能透明.也就是说,你现有的网络应用程序使用下面的代码就会自动支持网络代理. QNetworkProxy proxy; proxy.setType(QN

QT中的QInputDialog的小例子

其实这断代码没什么优秀之处,贴出来主要为为了方便自己和他人,因为以后如果用到这一块的话,这些代码可能能够直接拿过来用. InpugDialog.h头文件: #ifndef INPUGDIALOG_H #define INPUGDIALOG_H #include <QtGui> #include "ui_inpugdialog.h" class InpugDialog : public QDialog { Q_OBJECT public: InpugDialog(QWidge

vs2008-VS搭配QT,x64平台下为挖三维编的dll,怎么调试

问题描述 VS搭配QT,x64平台下为挖三维编的dll,怎么调试 VS搭配QT,x64平台下为挖三维编的dll,怎么调试?新手,试过用挖三维打开调试,但是没看到界面在哪里,请懂得QT的前辈回答,谢谢! 解决方案 https://github.com/Vaa3D/Vaa3D_Wiki/wiki/Build-Vaa3D-on-Linux

qt如何实现 滑动屏幕的效果

问题描述 qt如何实现 滑动屏幕的效果 用了qtscrollArea做了只能靠移动滑动条来实现滑动的效果,怎么样才能做到用触摸屏实现滑动效果,而不是靠滑动条.求大神指点. 解决方案 不要依赖于 qtscrollArea,自己做滑动效果,这样就可以不依靠滑动条.

[Qt教程] 第19篇 2D绘图(九)图形视图框架(上)

[Qt教程] 第19篇 2D绘图(九)图形视图框架(上) 楼主  发表于 2013-5-4 15:26:20 | 查看: 1798| 回复: 26 图形视图框架(上) 版权声明 导语 在前面讲的基本绘图中,我们可以自己绘制各种图形,并且控制它们.但是,如果需要同时绘制很多个相同或不同的图形,并且要控制它们的移动,检测它们的碰撞和叠加:或者我们想让自己绘制的图形可以拖动位置,进行缩放和旋转等操作.实现这些功能,要是还使用以前的方法,那么会十分困难.解决这些问题,可以使用Qt提供的图形视图框架.  

[Qt教程] 第20篇 2D绘图(十)图形视图框架(下)

[Qt教程] 第20篇 2D绘图(十)图形视图框架(下) 楼主  发表于 2013-5-4 15:43:02 | 查看: 861| 回复: 0 图形视图框架(下) 版权声明 该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处! 导语 环境:Windows Xp + Qt 4.8.4+QtCreator 2.6.2 目录 三.场景(QGraphicsScene) (一)场景层 (二)索引算法 (三)边界矩形 (四)图形项查找 (五)事件处理和传播 (