QUrlQuery Class

QUrlQuery 类提供了一种操作 URL 查询中键值对的方法。更多

Header: #include <QUrlQuery>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

该类具有等价可比性

注意:该类中的所有函数都是可重入的

公共函数

QUrlQuery()
QUrlQuery(const QString &queryString)
QUrlQuery(const QUrl &url)
QUrlQuery(std::initializer_list<std::pair<QString, QString>> list)
QUrlQuery(const QUrlQuery &other)
(since 6.5) QUrlQuery(QUrlQuery &&other)
~QUrlQuery()
void addQueryItem(const QString &key, const QString &value)
QStringList allQueryItemValues(const QString &key, QUrl::ComponentFormattingOptions encoding = QUrl::PrettyDecoded) const
void clear()
bool hasQueryItem(const QString &key) const
bool isEmpty() const
QString query(QUrl::ComponentFormattingOptions encoding = QUrl::PrettyDecoded) const
QString queryItemValue(const QString &key, QUrl::ComponentFormattingOptions encoding = QUrl::PrettyDecoded) const
QList<std::pair<QString, QString>> queryItems(QUrl::ComponentFormattingOptions encoding = QUrl::PrettyDecoded) const
QChar queryPairDelimiter() const
QChar queryValueDelimiter() const
void removeAllQueryItems(const QString &key)
void removeQueryItem(const QString &key)
void setQuery(const QString &queryString)
void setQueryDelimiters(QChar valueDelimiter, QChar pairDelimiter)
void setQueryItems(const QList<std::pair<QString, QString>> &query)
void swap(QUrlQuery &other)
QString toString(QUrl::ComponentFormattingOptions encoding = QUrl::PrettyDecoded) const
QUrlQuery &operator=(QUrlQuery &&other)
QUrlQuery &operator=(const QUrlQuery &other)

静态公共成员

size_t qHash(const QUrlQuery &key, size_t seed = 0)
bool operator!=(const QUrlQuery &lhs, const QUrlQuery &rhs)
bool operator==(const QUrlQuery &lhs, const QUrlQuery &rhs)

详细说明

该类用于解析如下 URL 中的查询字符串:

类似上述的查询字符串用于传输 URL 中的选项,通常被解码为多个键值对。上面的查询字符串在其列表中包含两个条目,键值分别为 "type "和 "color"。QUrlQuery 也可用于从查询的各个部分创建适合在QUrl::setQuery() 中使用的查询字符串。

解析查询字符串最常用的方法是在构造函数中通过传递查询字符串来初始化查询字符串。否则,可以使用setQuery() 方法设置要解析的查询。在使用setQueryDelimiters() 函数设置了非标准分隔符后,还可以使用该方法解析带有非标准分隔符的查询。

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

编码

QUrlQuery 中的所有获取方法都支持一个QUrl::ComponentFormattingOptions 类型的可选参数,包括query(),该参数决定了如何对相关数据进行编码。除了QUrl::FullyDecoded 之外,返回值仍必须视为百分数编码字符串,因为某些值无法以解码形式表达(如控制字符、无法解码为 UTF-8 的字节序列)。因此,百分数字符总是用字符串"%25 "表示。

QUrlQuery 中的所有设置器方法和查询方法(如hasQueryItem() )都只使用编码形式。与QUrl 不同,QUrlQuery 中没有可选参数来指定传递的字符串是否已解码。如果向 setter 或查询方法传递了编码不当的字符串,QUrlQuery 将尝试恢复而不是失败。也就是说,该类中的所有函数都会像指定QUrl::TolerantMode 解码模式一样解析其字符串参数。

应用程序代码应努力确保编码正确,而不是依赖 TolerantMode 解析来修复字符串。值得注意的是,所有用户输入必须先使用QUrl::toPercentEncoding() 或类似函数进行百分比编码,然后再传递给该类中的函数。

空格和加号("+")的处理

网络浏览器通常会将 HTML FORM 元素中的空格编码为加号("+"),并将加号编码为百分比编码形式(%2B)。但是,管理 URL 的互联网规范并不将空格和加号字符等同看待。

因此,QUrlQuery 不会将空格字符编码为 "+",也不会将 "+"解码为空格字符。相反,空格字符将以编码形式呈现为"%20"。

为了支持类似 HTML 表单的编码,QUrlQuery 也从不将"%2B "序列解码为加号,也不对加号进行编码。事实上,在键、值或查询字符串中发现的任何"%2B "或 "+"序列都会像写的一样保留(除了将"%2b "改为"%2B "之外)。

完全解码

使用QUrl::FullyDecoded 格式化时,所有百分数编码序列都将被完全解码,并使用"%"字符表示其本身。使用QUrl::FullyDecoded 时应小心,因为它可能会导致数据丢失。有关可能丢失哪些数据的信息,请参阅QUrl::FullyDecoded 文档。

这种格式化模式只适用于在不希望使用百分数编码的情况下处理呈现给用户的文本。请注意,QUrlQuery 设置器和查询方法不支持对应的QUrl::DecodedMode 解析,因此使用QUrl::FullyDecoded 获取键列表可能会导致在对象中找不到键。

非标准分隔符

默认情况下,QUrlQuery 使用等号("=")分隔键和键值,使用双引号("&")分隔键值对。通过调用setQueryDelimiters() 可以更改 QUrlQuery 在解析和重构查询时使用的分隔符。

非标准分隔符应从 RFC 3986 所称的 "子分隔符 "中选择。它们是

sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

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

另请参阅 QUrl

成员函数文档

QUrlQuery::QUrlQuery()

构造一个空的 QUrlQuery 对象。之后可通过调用setQuery() 设置查询,或通过addQueryItem() 添加项目。

另请参阅 setQuery() 和addQueryItem()。

[explicit] QUrlQuery::QUrlQuery(const QString &queryString)

构造一个 QUrlQuery 对象,并使用默认的查询分隔符解析queryString 查询字符串。要使用其他分隔符解析查询字符串,应首先使用setQueryDelimiters() 设置分隔符,然后使用setQuery() 设置查询。

[explicit] QUrlQuery::QUrlQuery(const QUrl &url)

构造一个 QUrlQuery 对象,并使用默认查询分隔符解析url URL 中的查询字符串。要使用其他分隔符解析查询字符串,应首先使用setQueryDelimiters() 设置分隔符,然后使用setQuery() 设置查询。

另请参阅 QUrl::query()。

QUrlQuery::QUrlQuery(std::initializer_list<std::pair<QString, QString>> list)

list 的键/值对中构造一个 QUrlQuery 对象。

QUrlQuery::QUrlQuery(const QUrlQuery &other)

复制other QUrlQuery 对象的内容,包括查询分隔符。

[noexcept, since 6.5] QUrlQuery::QUrlQuery(QUrlQuery &&other)

移动other QUrlQuery 对象的内容,包括查询分隔符。

此函数在 Qt 6.5 中引入。

[noexcept] QUrlQuery::~QUrlQuery()

销毁QUrlQuery 对象。

void QUrlQuery::addQueryItem(const QString &key, const QString &value)

key =value 添加到 URL 查询字符串的末尾。此方法不会覆盖可能存在的具有相同密钥的项目。

注意: 此方法不会像 HTML 表单那样将空格(ASCII 0x20)和加号("+")视为相同的符号。如果需要将空格表示为加号,请使用实际的加号。

注意: 键和值字符串应采用百分数编码形式。

另请参阅 hasQueryItem() 和queryItemValue()。

QStringList QUrlQuery::allQueryItemValues(const QString &key, QUrl::ComponentFormattingOptions encoding = QUrl::PrettyDecoded) const

使用encoding 中指定的选项对返回值进行编码,返回 URL 中键等于key 的查询字符串值列表。如果未找到键key ,该函数将返回空列表。

注意: 键值应为百分数编码形式。

另请参阅 queryItemValue() 和addQueryItem()。

void QUrlQuery::clear()

删除当前存储的所有键值对,从而清除QUrlQuery 对象。如果查询分隔符已更改,该函数将保留更改后的值。

另请参阅 isEmpty() 和setQueryDelimiters()。

[static constexpr noexcept] char16_t QUrlQuery::defaultQueryPairDelimiter()

返回用于分隔键值对的默认字符,即"&"。

注: 在 Qt XML 6 之前,此函数返回QChar

另请参阅 setQueryDelimiters()、queryPairDelimiter() 和defaultQueryValueDelimiter()。

[static constexpr noexcept] char16_t QUrlQuery::defaultQueryValueDelimiter()

返回查询中用于分隔键和值的默认字符,即等号("=")。

注: 在 Qt XML 6 之前,此函数返回QChar

另请参阅 setQueryDelimiters()、queryValueDelimiter() 和defaultQueryPairDelimiter()。

bool QUrlQuery::hasQueryItem(const QString &key) const

如果存在键等于key 的查询字符串对,则返回true

注: 键值应为百分数编码形式。

另请参阅 addQueryItem() 和queryItemValue()。

bool QUrlQuery::isEmpty() const

如果QUrlQuery 对象不包含键值对,例如在默认构造或解析空查询字符串后,则返回true

另请参阅 setQuery() 和clear()。

QString QUrlQuery::query(QUrl::ComponentFormattingOptions encoding = QUrl::PrettyDecoded) const

返回重建的查询字符串,该字符串由当前存储在QUrlQuery 对象中的键值对组成,并用为该对象选择的查询分隔符分隔。键和值使用encoding 参数给出的选项进行编码。

在该函数中,唯一不明确的分隔符是散列("#"),因为在 URL 中,它用于分隔查询字符串和后面的片段。

返回字符串中键值对的顺序与原始查询完全相同。

另请参阅 setQuery()、QUrl::setQuery()、QUrl::fragment() 和Encoding

QString QUrlQuery::queryItemValue(const QString &key, QUrl::ComponentFormattingOptions encoding = QUrl::PrettyDecoded) const

使用encoding 中指定的选项对返回值进行编码,从 URL 返回与关键字key 相关联的查询值。如果未找到键key ,该函数将返回空字符串。如果需要区分空值和不存在的键,应首先使用hasQueryItem() 检查键是否存在。

如果密钥key 是多重定义的,该函数将按照查询字符串中存在的顺序或使用addQueryItem() 添加的顺序,返回找到的第一个密钥。

注意: 键值应为百分数编码形式。

另请参阅 addQueryItem(),allQueryItemValues() 和Encoding

QList<std::pair<QString, QString>> QUrlQuery::queryItems(QUrl::ComponentFormattingOptions encoding = QUrl::PrettyDecoded) const

使用encoding 中指定的选项对项目进行编码,以键和值映射的形式返回 URL 的查询字符串。元素的顺序与查询字符串中的顺序或使用setQueryItems() 设置的顺序相同。

另请参阅 setQueryItems() 和编码

QChar QUrlQuery::queryPairDelimiter() const

query() 中重构查询字符串或在setQuery() 中进行解析时,返回键值对之间用于分隔的字符。

另请参阅 setQueryDelimiters() 和queryValueDelimiter()。

QChar QUrlQuery::queryValueDelimiter() const

query() 中重构查询字符串或在setQuery() 中进行解析时,返回键和值之间的分界字符。

另请参阅 setQueryDelimiters() 和queryPairDelimiter()。

void QUrlQuery::removeAllQueryItems(const QString &key)

从 URL 中删除键等于key 的所有查询字符串对。

注意: 键值应为百分数编码形式。

另请参阅 removeQueryItem().

void QUrlQuery::removeQueryItem(const QString &key)

从 URL 中删除键等于key 的查询字符串对。如果有多个项目的关键字等于key ,则会按照它们在查询字符串中出现的顺序或使用addQueryItem() 添加的顺序删除第一个项目。

注意: 键值应为百分数编码形式。

另请参阅 removeAllQueryItems()。

void QUrlQuery::setQuery(const QString &queryString)

解析queryString 中的查询字符串,并将内部项设置为其中的值。如果使用setQueryDelimiters() 指定了分隔符,该函数将使用这些分隔符而不是默认分隔符来解析字符串。

另请参见 query()。

void QUrlQuery::setQueryDelimiters(QChar valueDelimiter, QChar pairDelimiter)

设置 URL 查询字符串中键和值之间以及键值对之间的分隔符。默认值分隔符为"=",默认键值对分隔符为"&"。

valueDelimiter 用于分隔键和值, 用于分隔键值对。在 () 中返回查询字符串的键和值的编码表示时,这些分隔符的任何出现都将按百分比编码。pairDelimiter query

如果valueDelimiter 设置为',',而pairDelimiter 设置为';',则上述查询字符串的表示方法如下:

http://www.example.com/cgi-bin/drawgraph.cgi?type,pie;color,green

注: 非标准分隔符应从 RFC 3986 所称的 "子分隔符 "中选择。它们是

sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

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

另请参阅 queryValueDelimiter() 和queryPairDelimiter()。

void QUrlQuery::setQueryItems(const QList<std::pair<QString, QString>> &query)

QUrlQuery 对象中的项目设置为queryquery 中元素的顺序保持不变。

注意: 此方法不会像 HTML 表单那样将空格(ASCII 0x20)和加号("+")视为相同的符号。如果需要将空格表示为加号,请使用实际的加号。

注意: 键和值应采用百分数编码形式。

另请参阅 queryItems() 和isEmpty()。

[noexcept] void QUrlQuery::swap(QUrlQuery &other)

将此 URL 查询实例与other 互换。该操作速度非常快,而且从未出现过故障。

QString QUrlQuery::toString(QUrl::ComponentFormattingOptions encoding = QUrl::PrettyDecoded) const

QUrlQuery QString encoding 可用于指定返回值的 URL 字符串编码。

[noexcept] QUrlQuery &QUrlQuery::operator=(QUrlQuery &&other)

Move-assignsother 到此QUrlQuery 实例。

QUrlQuery &QUrlQuery::operator=(const QUrlQuery &other)

复制other QUrlQuery 对象的内容,包括查询分隔符。

相关非成员

[noexcept] size_t qHash(const QUrlQuery &key, size_t seed = 0)

返回key 的哈希值,使用seed 作为计算的种子。

[noexcept] bool operator!=(const QUrlQuery &lhs, const QUrlQuery &rhs)

如果QUrlQuery 对象rhs 不等于lhs ,则返回true 。否则,返回false

另请参阅 operator==() 。

[noexcept] bool operator==(const QUrlQuery &lhs, const QUrlQuery &rhs)

如果QUrlQuery 对象lhsrhs 包含相同的内容、相同的顺序并使用相同的查询分隔符,则返回true

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.