本页内容

QUrl Class

QUrl 类为处理 URL 提供了一个便捷的接口。更多内容...

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

注意:该类中的所有函数均为可重入的。

QUrl 比较

类别可比较类型
弱QUrl

公共类型

(since 6.3) enum AceProcessingOption { IgnoreIDNWhitelist, AceTransitionalProcessing }
flags AceProcessingOptions
enum ComponentFormattingOption { PrettyDecoded, EncodeSpaces, EncodeUnicode, EncodeDelimiters, EncodeReserved, …, FullyDecoded }
flags ComponentFormattingOptions
flags FormattingOptions
enum ParsingMode { TolerantMode, StrictMode, DecodedMode }
enum UrlFormattingOption { None, RemoveScheme, RemovePassword, RemoveUserInfo, RemovePort, …, NormalizePathSegments }
enum UserInputResolutionOption { DefaultResolution, AssumeLocalFile }
flags UserInputResolutionOptions

公共函数

QUrl()
QUrl(const QString &url, QUrl::ParsingMode parsingMode = TolerantMode)
QUrl(const QUrl &other)
QUrl(QUrl &&other)
~QUrl()
QUrl adjusted(QUrl::FormattingOptions options) const
QString authority(QUrl::ComponentFormattingOptions options = PrettyDecoded) const
void clear()
QString errorString() const
QString fileName(QUrl::ComponentFormattingOptions options = FullyDecoded) const
QString fragment(QUrl::ComponentFormattingOptions options = PrettyDecoded) const
bool hasFragment() const
bool hasQuery() const
QString host(QUrl::ComponentFormattingOptions options = FullyDecoded) const
bool isEmpty() const
bool isLocalFile() const
bool isParentOf(const QUrl &childUrl) const
bool isRelative() const
bool isValid() const
bool matches(const QUrl &url, QUrl::FormattingOptions options) const
QString password(QUrl::ComponentFormattingOptions options = FullyDecoded) const
QString path(QUrl::ComponentFormattingOptions options = FullyDecoded) const
int port(int defaultPort = -1) const
QString query(QUrl::ComponentFormattingOptions options = PrettyDecoded) const
QUrl resolved(const QUrl &relative) const
QString scheme() const
void setAuthority(const QString &authority, QUrl::ParsingMode mode = TolerantMode)
void setFragment(const QString &fragment, QUrl::ParsingMode mode = TolerantMode)
void setHost(const QString &host, QUrl::ParsingMode mode = DecodedMode)
void setPassword(const QString &password, QUrl::ParsingMode mode = DecodedMode)
void setPath(const QString &path, QUrl::ParsingMode mode = DecodedMode)
void setPort(int port)
void setQuery(const QString &query, QUrl::ParsingMode mode = TolerantMode)
void setQuery(const QUrlQuery &query)
void setScheme(const QString &scheme)
void setUrl(const QString &url, QUrl::ParsingMode parsingMode = TolerantMode)
void setUserInfo(const QString &userInfo, QUrl::ParsingMode mode = TolerantMode)
void setUserName(const QString &userName, QUrl::ParsingMode mode = DecodedMode)
void swap(QUrl &other)
CFURLRef toCFURL() const
QString toDisplayString(QUrl::FormattingOptions options = FormattingOptions(PrettyDecoded)) const
QByteArray toEncoded(QUrl::FormattingOptions options = FullyEncoded) const
QString toLocalFile() const
NSURL *toNSURL() const
QString toString(QUrl::FormattingOptions options = FormattingOptions(PrettyDecoded)) const
QString url(QUrl::FormattingOptions options = FormattingOptions(PrettyDecoded)) const
QString userInfo(QUrl::ComponentFormattingOptions options = PrettyDecoded) const
QString userName(QUrl::ComponentFormattingOptions options = FullyDecoded) const
QUrl &operator=(QUrl &&other)
QUrl &operator=(const QString &url)
QUrl &operator=(const QUrl &url)

静态公共成员

(since 6.3) QString fromAce(const QByteArray &domain, QUrl::AceProcessingOptions options = {})
QUrl fromCFURL(CFURLRef url)
QUrl fromEncoded(QByteArrayView input, QUrl::ParsingMode mode = TolerantMode)
QUrl fromLocalFile(const QString &localFile)
QUrl fromNSURL(const NSURL *url)
QString fromPercentEncoding(const QByteArray &input)
QList<QUrl> fromStringList(const QStringList &urls, QUrl::ParsingMode mode = TolerantMode)
QUrl fromUserInput(const QString &userInput, const QString &workingDirectory = QString(), QUrl::UserInputResolutionOptions options = DefaultResolution)
QStringList idnWhitelist()
void setIdnWhitelist(const QStringList &list)
(since 6.3) QByteArray toAce(const QString &domain, QUrl::AceProcessingOptions options = {})
QByteArray toPercentEncoding(const QString &input, const QByteArray &exclude = QByteArray(), const QByteArray &include = QByteArray())
QStringList toStringList(const QList<QUrl> &urls, QUrl::FormattingOptions options = FormattingOptions(PrettyDecoded))
bool operator!=(const QUrl &lhs, const QUrl &rhs)
QDataStream &operator<<(QDataStream &out, const QUrl &url)
bool operator==(const QUrl &lhs, const QUrl &rhs)
QDataStream &operator>>(QDataStream &in, QUrl &url)

宏

详细说明

它能够解析和构建编码及未编码形式的URL。QUrl还支持国际化域名(IDN)。

使用 QUrl 最常见的方式是通过构造函数进行初始化,方法是传入一个包含完整 URL 的 `QString `。QUrl 对象还可以通过 `QUrl::fromEncoded()` 方法,从包含完整 URL 的 `QByteArray ` 对象创建,或者通过 `QUrl::fromUserInput()` 方法,根据不完整的 URL 进行推断生成。可以通过 `QUrl::toString()` 或 `QUrl::toEncoded()` 方法从 QUrl 对象中获取 URL 表示形式。

URL 可以以两种形式表示:编码形式或未编码形式。未编码形式适合展示给用户,但通常发送给 Web 服务器的是编码形式。 例如,未编码的 URL“http://bühler.example.com/List of applicants.xml”将作为“http://xn–bhler-kva.example.com/List%20of%20applicants.xml”发送至服务器。

URL 还可以通过依次调用setScheme()、setUserName()、setPassword()、setHost()、setPort()、setPath()、setQuery() 和setFragment() 函数来逐段构建。此外还提供了一些便捷函数:setAuthority() 可设置用户名、密码、主机和端口;setUserInfo() 可同时设置用户名和密码。

调用isValid()来检查URL是否有效。这可以在构建URL过程的任何阶段进行。如果isValid()返回false ,则应在继续操作前对URL调用clear(),或者使用setUrl()解析一个新的URL并重新开始。

通过使用QUrlQuery 类及其方法QUrlQuery::setQueryItems()、QUrlQuery::addQueryItem()和QUrlQuery::removeQueryItem(),可以非常方便地构建查询字符串。使用QUrlQuery::setQueryDelimiters()可自定义生成查询字符串时使用的分隔符。

为了方便生成编码后的 URL 字符串或查询字符串,提供了两个名为fromPercentEncoding() 和toPercentEncoding() 的静态函数,它们负责对QString 对象进行百分比编码和解码。

fromLocalFile() 通过解析本地文件路径来构建一个 QUrl 对象。toLocalFile() 将 URL 转换为本地文件路径。

可通过toString() 获取 URL 的可读表示形式。该表示形式适用于以未编码形式向用户显示 URL。 然而,由toEncoded()返回的编码形式则用于内部处理,例如传递给Web服务器、邮件客户端等。这两种形式在技术上都是正确的,并且明确地表示同一个URL——事实上,将任一形式传递给QUrl的构造函数或setUrl()都会生成相同的QUrl对象。

QUrl 符合RFC 3986(统一资源标识符:通用语法)中的 URI 规范,并包含RFC 1738(统一资源定位符)中的方案扩展。 QUrl 中的大小写转换规则符合RFC 3491(Nameprep:国际化域名 (IDN) 的 Stringprep 配置文件)的规定。 它还与 freedesktop.org中的文件 URI 规范兼容,前提是该区域设置使用 UTF-8 编码文件名(这是 IDN 的要求)。

相对 URL 与相对路径

调用isRelative()将返回该URL是否为相对URL。相对URL不包含scheme 。例如:

qDebug()<<QUrl("main.qml").isRelative();          // true:无协议
qDebug() << QUrl("qml/main.qml").isRelative();      // true: no scheme
qDebug() << QUrl("file:main.qml").isRelative();     // false: has "file" scheme
qDebug() << QUrl("file:qml/main.qml").isRelative(); // false: has "file" scheme

请注意,一个 URL 既可以是绝对 URL 又包含相对路径,反之亦然:

// 绝对 URL,相对路径
QUrl url("file:file.txt");
qDebug() << url.isRelative();                 // false: has "file" scheme
qDebug() << QDir::isAbsolutePath(url.path()); // false: relative path

// 相对 URL,绝对路径
url=QUrl("/home/user/file.txt");
qDebug() << url.isRelative();                 // true: has no scheme
qDebug() << QDir::isAbsolutePath(url.path()); // true: absolute path

可以通过将相对 URL 作为参数传递给 `resolved()` 来解析它,该函数会返回一个绝对 URL。`isParentOf()` 用于判断一个 URL 是否是另一个 URL 的父级。

错误检查

QUrl 能够在解析 URL 时,或在通过单独的设置方法(如setScheme()、setHost() 或setPath())设置 URL 组件时,检测到许多错误。如果解析或设置函数执行成功,则之前记录的任何错误条件都将被丢弃。

默认情况下,QUrl 的设置方法采用QUrl::TolerantMode 模式,这意味着它们会容忍一些常见的错误和数据表示不准确的情况。另一种解析方法是QUrl::StrictMode 模式,该模式会进行更严格的检查。有关不同解析模式的区别,请参阅QUrl::ParsingMode 。

QUrl 仅检查 URL 是否符合规范,不会验证高级协议 URL 是否符合其他处理程序所期望的格式。例如,以下 URI 均被 QUrl 视为有效,即使实际使用时毫无意义:

  • "http:/filename.html"
  • "mailto://example.com"

当解析器遇到错误时,它会通过让 `isValid()` 返回 `false`,以及让 `toString()` / `toEncoded()` 返回空字符串来触发该事件。如果需要向用户显示 URL 解析失败的原因,可以通过调用 `errorString()` 从 QUrl 获取错误状态。 请注意,此消息具有很强的技术性,最终用户可能无法理解。

QUrl 只能记录一种错误情况。如果发现多个错误,则无法确定报告的是哪个错误。

字符转换

处理 URL 和字符串时,请遵循以下规则以避免字符转换错误:

安全注意事项

将来自不可信来源(网络、文件或文档、其他应用程序或用户)的 URL 视为恶意输入。

  • 对解析后的 URL 进行验证,切勿直接验证原始字符串。对 QUrl 提取的组件(如主机、来源或重定向规则)执行允许/拒绝列表、来源或重定向检查——进行主机检查时请使用url.host(QUrl::FullyEncoded) ——而非对原始文本进行检查。 QUrl 会规范化字符串检查无法识别的格式:http://0x7f.0.0.1 和http://2130706433 都会生成主机127.0.0.1 ,而http://good.com\\@evil.com/ 则生成主机evil.com 。请使用FullyEncoded 而不是默认的解码形式,这样国际化域名(IDN)主机将以 ASCII 形式进行比较,从而无法被外观相似的 Unicode 字符所伪造。
  • 在检查和请求中应使用相同的解析后 URL。若随后将原始字符串传递给另一个解析器,将导致原本通过检查消除的不匹配问题再次出现。
  • 使用FullyDecoded 获取组件时需格外谨慎。根据获取的组件不同,结果可能存在信息丢失,甚至产生不同的含义。结果中还可能包含控制字符,包括NUL 。更多详细信息请参阅Full decoding 。

成员类型文档

[since 6.3] enum QUrl::AceProcessingOption
flags QUrl::AceProcessingOptions

ACE 处理选项控制 URL 在 ASCII 兼容编码与非 ASCII 兼容编码之间进行转换的方式。

常量值描述
QUrl::IgnoreIDNWhitelist0x1将 URL 转换为 Unicode 时,忽略 IDN 白名单。
QUrl::AceTransitionalProcessing0x2使用 UTS #46 中描述的过渡处理。这可以实现与 IDNA 2003 规范更好的兼容性。

默认情况下,将使用非过渡性处理,并且仅允许在顶级域名列于 IDN 白名单中的 URL 内使用非 ASCII 字符。

该枚举在 Qt 6.3 中引入。

AceProcessingOptions 类型是QFlags<AceProcessingOption> 的 typedef。它存储 AceProcessingOption 值的或(OR)组合。

另请参阅 toAce()、fromAce() 和idnWhitelist()。

enum QUrl::ComponentFormattingOption
flags QUrl::ComponentFormattingOptions

组件格式化选项定义了在将 URL 作为文本输出时,其各组件应采用何种格式。在调用 `toString()` 和 `toEncoded()` 时,这些选项可与 `QUrl::FormattingOptions ` 中的选项结合使用。

常量值描述
QUrl::PrettyDecoded0x000000该组件以“美观形式”返回,其中大部分百分比编码字符已被解码。PrettyDecoded 的具体行为因组件而异,也可能随 Qt 版本的不同而变化。这是默认行为。
QUrl::EncodeSpaces0x100000将空格字符保留为编码形式(“%20”)。
QUrl::EncodeUnicode0x200000将非 US-ASCII 字符保留为 UTF-8 百分比编码形式(例如,代码点 U+00E9 对应“%C3%A9”,即带 acute 符号的小写拉丁字母 E)。
QUrl::EncodeDelimiters0x400000 | 0x800000将某些分隔符保留为编码形式,即当完整 URL 以文本形式表示时,这些分隔符在 URL 中出现的形式。受此选项影响的分隔符因组件而异。该标志在toString() 或toEncoded() 中无效。
QUrl::EncodeReserved0x1000000将规范中不允许出现在 URL 中的 US-ASCII 字符保留为编码形式。这是toString() 和toEncoded() 的默认行为。
QUrl::DecodeReserved0x2000000将 URL 规范中不允许出现在 URL 中的 US-ASCII 字符进行解码。这是各个组件的 getter 方法的默认行为。
QUrl::FullyEncodedEncodeSpaces | EncodeUnicode | EncodeDelimiters | EncodeReserved将所有字符保留为其正确编码的形式,就像该组件作为 URL 的一部分出现时那样。当与toString() 一起使用时,这会生成一个完全符合规范的QString 形式的 URL,其结果与toEncoded() 的结果完全相同
QUrl::FullyDecodedFullyEncoded | DecodeReserved | 0x4000000尝试尽可能多地进行解码。对于 URL 的各个组成部分,此模式会解码每个百分比编码序列,包括控制字符(U+0000 至 U+001F)以及以百分比编码形式出现的 UTF-8 序列。使用此模式可能会导致数据丢失,更多信息请参见下文。

不应在同一调用中同时使用 EncodeReserved 和 DecodeReserved 这两个值。若发生这种情况,行为将未定义。之所以将它们作为独立值提供,是因为“美观模式”在处理保留字符时的行为在某些组件上(尤其是整个 URL)有所不同。

完全解码

FullyDecoded 模式与 Qt 4.x 中返回 `QString ` 的函数行为类似,即每个字符都代表其本身,且绝不具有任何特殊含义。即使对于百分号字符('%')也是如此,它应被解释为字面意义上的百分号,而非百分号编码序列的开头。 而在所有其他解码模式中,同一个实际字符则由字符序列“%25”表示。

每当将通过 QUrl::FullyDecoded 获取的数据重新应用到QUrl 中时,必须注意在设置器(如setPath() 和setUserName())中使用QUrl::DecodedMode 参数。若未这样做,可能会导致百分号字符('%')被重新解释为百分号编码序列的开头。

当 URL 的部分内容用于非 URL 上下文时,此模式非常有用。例如,要在 FTP 客户端应用程序中提取用户名、密码或文件路径,应使用 FullyDecoded 模式。

使用此模式时应谨慎,因为有两种情况无法在返回的QString 中可靠地表示。它们是:

  • 非UTF-8字符序列:URL可能包含一串百分比编码的字符,这些字符无法构成有效的UTF-8序列。由于URL需要使用UTF-8进行解码,任何解码失败都会导致QString 在该序列所在的位置包含一个或多个替换字符。
  • 编码分隔符:URL 还允许区分以字面形式出现的分隔符与其等效的百分比编码形式。这种情况最常见于查询部分,但在 URL 的大多数部分也是允许的。

以下示例说明了该问题:

QUrl original("http://example.com/?q=a%2B%3Db%26c");
QUrl copy(original);
copy.setQuery(copy.query(QUrl::FullyDecoded),QUrl::DecodedMode);

qDebug() << original.toString();   // prints: http://example.com/?q=a%2B%3Db%26c
qDebug() << copy.toString();       // prints: http://example.com/?q=a+=b&c

如果这两个 URL 是通过 HTTP GET 请求调用的,Web 服务器对它们的解析结果可能会有所不同。在第一种情况下,服务器会将其解析为一个参数,键为“q”,值为“a+=b&c”。 在第二种情况下,它可能会将其解释为两个参数:一个键为“q”、值为“a =b”,另一个键为“c”但无值。

ComponentFormattingOptions 类型是QFlags<ComponentFormattingOption> 的 typedef。它存储了 ComponentFormattingOption 值的按“或”运算组合。

另请参阅 QUrl::FormattingOptions 。

enum QUrl::ParsingMode

解析模式控制着QUrl 解析字符串的方式。

常量值描述
QUrl::TolerantMode0QUrl 将尝试纠正 URL 中的一些常见错误。此模式对于解析来自未严格遵守标准的来源的 URL 非常有用。
QUrl::StrictMode1仅接受有效的 URL。此模式适用于一般的 URL 验证。
QUrl::DecodedMode2QUrl 将以完全解码的形式解释 URL 组件,其中百分号字符代表其本身,而非百分号编码序列的开头。此模式仅适用于设置 URL 组件的 setter 方法;在QUrl 构造函数、fromEncoded() 或setUrl() 中不允许使用此模式。有关此模式的更多信息,请参阅QUrl::FullyDecoded 的文档。

在 TolerantMode 下,解析器具有以下行为:

  • 空格和“%20”:未编码的空格字符将被接受,并被视为等同于“%20”。
  • 单个“%”字符:如果任何百分号“%”后面没有跟随两个十六进制字符(例如,“13% coverage.html”),解析器将认为输入未经过编码,并会将所有“%”字符替换为“%25”。
  • 保留字符和非保留字符:编码后的 URL 应仅包含少量字符作为字面量;所有其他字符都应进行百分比编码。 在 TolerantMode 下,如果 URL 中出现以下字符,它们将被接受:空格 / 双引号 / "<" / ">" / "" / "^" / "`" / "{" / "|" / "}" 可以通过向toString() 或toEncoded() 传递QUrl::DecodeReserved 来对这些字符进行解码。在各个组件的获取器中,这些字符通常以解码形式返回。

在 StrictMode 模式下,若发现解析错误,isValid() 将返回false ,而errorString() 将返回一条描述错误的消息。若检测到多个错误,则无法确定会报告哪个错误。

请注意,宽容模式(TolerantMode)通常不足以解析用户输入,因为用户输入中包含的错误和预期情况往往超出了解析器的处理能力。在处理直接来自用户的数据时(区别于来自数据传输源的数据,例如其他程序),建议使用fromUserInput()。

另请参阅 fromUserInput()、setUrl()、toString()、toEncoded() 以及QUrl::FormattingOptions 。

enum QUrl::UrlFormattingOption
flags QUrl::FormattingOptions

格式设置选项用于定义将 URL 作为文本输出时的格式。

常量值描述
QUrl::None0x0URL 的格式保持不变。
QUrl::RemoveScheme0x1从 URL 中删除方案。
QUrl::RemovePassword0x2URL 中的任何密码均被移除。
QUrl::RemoveUserInfoRemovePassword | 0x4URL 中的任何用户信息均被移除。
QUrl::RemovePort0x8URL 中指定的端口被移除。
QUrl::RemoveAuthorityRemoveUserInfo | RemovePort | 0x10删除用户名、密码、主机和端口。
QUrl::RemovePath0x20URL 的路径被移除,仅保留协议、主机地址和端口(如有)。
QUrl::RemoveQuery0x40URL 中的查询部分(位于“?”字符之后)将被删除。
QUrl::RemoveFragment0x80URL 中的片段部分(包括“#”字符)将被删除。
QUrl::RemoveFilename0x800文件名(即路径中最后一个“/”之后的所有内容)将被删除。除非设置了 StripTrailingSlash,否则尾部的“/”将被保留。仅在未设置 RemovePath 时有效。
QUrl::PreferLocalFile0x200如果 URL 根据 `isLocalFile()` 属于本地文件且不包含查询或片段,则返回本地文件路径。
QUrl::StripTrailingSlash0x400如果路径中存在尾部斜杠,则将其移除。
QUrl::NormalizePathSegments0x1000修改路径以删除多余的目录分隔符,并尽可能解析“.”和“..”。对于非本地路径,相邻的斜杠将被保留。

请注意,QUrl 遵循的Nameprep 中的大小写转换规则要求,无论使用何种 Qt::FormattingOptions,主机名都必须始终转换为小写。

QUrl::ComponentFormattingOptions 中的选项同样适用。

FormattingOptions 类型是QFlags<UrlFormattingOption> 的 typedef。它存储 UrlFormattingOption 值的“或”组合。

另请参阅 QUrl::ComponentFormattingOptions 。

enum QUrl::UserInputResolutionOption
flags QUrl::UserInputResolutionOptions

用户输入的分辨率选项定义了fromUserInput() 应如何解析那些既可能是相对路径,也可能是 HTTP URL 简写形式的字符串。例如,file.pl 既可能是本地文件,也可能是 URLhttp://file.pl 。

常量值描述
QUrl::DefaultResolution0默认解析机制是检查在传递给fromUserInput 的工作目录中是否存在本地文件,仅在此情况下才返回本地路径。否则,则假定其为 URL。
QUrl::AssumeLocalFile1此选项使fromUserInput() 始终返回本地路径,除非输入中包含方案,例如http://file.pl 。这对于文本编辑器等应用程序非常有用,因为它们可以在文件不存在时创建该文件。

UserInputResolutionOptions 类型是QFlags<UserInputResolutionOption> 的 typedef。它存储 UserInputResolutionOption 值的按“或”组合。

另请参阅 fromUserInput()。

成员函数文档

QUrl::QUrl()

创建一个空的 QUrl 对象。

QUrl::QUrl(const QString &url, QUrl::ParsingMode parsingMode = TolerantMode)

通过解析url 来构建一个 URL。请注意,该构造函数要求传入正确的 URL 或 URL 引用,且不会尝试推测其意图。例如,以下声明:

QUrl url("example.com");

将构建一个有效的 URL,但这可能并非预期结果,因为输入中缺少scheme() 部分。对于类似上述的字符串,应用程序可能希望使用fromUserInput()。对于此构造函数或setUrl(),以下代码可能更符合预期:

QUrl url("https://example.com");

QUrl 会自动对 URL 中不允许的所有字符进行百分比编码,并对代表非保留字符(字母、数字、连字符、下划线、点和波浪号)的百分比编码序列进行解码。所有其他字符则保持原样。

使用解析器模式parsingMode 解析url 。在TolerantMode (默认模式)下,QUrl 将纠正某些错误,特别是百分号('%')后未跟随两个十六进制数字的情况,并且会接受任何位置上的任意字符。 在StrictMode 模式下,不允许出现编码错误,且 QUrl 还会检查是否存在未经过编码的某些禁止字符。如果在StrictMode 模式下检测到错误,isValid() 将返回 false。在此上下文中,不允许使用解析模式DecodedMode 。

示例:

QUrl url("http://www.example.com/List of holidays.xml");
// url.toEncoded() == "http://www.example.com/List%20of%20holidays.xml"

要从编码字符串构建 URL,您还可以使用fromEncoded():

QUrl url = QUrl::fromEncoded("http://qt-project.org/List%20of%20holidays.xml");

这两个函数功能等同,且在 Qt 5 中均可接受编码数据。通常,选择 QUrl 构造函数或setUrl() 而不是fromEncoded(),取决于源数据:构造函数和setUrl() 接受QString 参数,而fromEncoded 则接受QByteArray 参数。

另请参阅 setUrl()、fromEncoded() 和TolerantMode 。

[noexcept] QUrl::QUrl(const QUrl &other)

创建other 的副本。

[noexcept] QUrl::QUrl(QUrl &&other)

通过“move”操作构造一个 QUrl 实例,使其指向与other 所指向的同一对象。

[noexcept] QUrl::~QUrl()

析构函数;在对象被删除之前立即调用。

QUrl QUrl::adjusted(QUrl::FormattingOptions options) const

返回经过调整的 URL。可以通过在options 中传递标志来自定义输出。

QUrl::ComponentFormattingOption 中的编码选项对于此方法意义不大,QUrl::PreferLocalFile 也是如此。

此方法始终等同于QUrl(url.toString(options))。

另请参阅 FormattingOptions 、toEncoded() 以及toString()。

QString QUrl::authority(QUrl::ComponentFormattingOptions options = PrettyDecoded) const

如果 URL 已定义,则返回其权威域名;否则返回空字符串。

该函数返回一个无歧义的值,其中可能包含仍采用百分比编码的字符,以及一些在QString 中无法以解码形式表示的控制序列。

参数 `options ` 控制用户信息组件的格式。本函数不允许使用 `QUrl::FullyDecoded ` 作为该参数的值。若需获取完全解码的数据,请分别调用userName()、password()、host() 和port() 函数。

另请参阅 setAuthority()、userInfo()、userName()、password()、host() 和port()。

void QUrl::clear()

重置QUrl 的内容。调用此函数后,QUrl 将等同于使用默认空构造函数构造的对象。

另请参阅 isEmpty()。

QString QUrl::errorString() const

如果最后一次修改此QUrl 对象的操作遇到了解析错误,则返回一条错误消息。如果未检测到错误,则该函数返回空字符串,且isValid()将返回true 。

该函数返回的错误消息属于技术性质,最终用户可能无法理解。它主要对试图了解QUrl 为何无法接受某些输入的开发人员有用。

另请参阅 QUrl::ParsingMode 。

QString QUrl::fileName(QUrl::ComponentFormattingOptions options = FullyDecoded) const

返回文件的名称,不包括目录路径。

请注意,如果此QUrl 对象的路径以斜杠结尾,则该文件的名称将被视为空。

如果路径中不包含任何斜杠,则将其完整地作为 fileName 返回。

示例:

QUrl url("http://qt-project.org/support/file.html");
// url.adjusted(RemoveFilename) == "http://qt-project.org/support/"
// url.fileName() == "file.html"

options 参数控制文件名部分的格式化方式。所有值都会产生明确无误的结果。当设置为QUrl::FullyDecoded 时,所有百分比编码序列都会被解码;否则,对于某些在QString 中无法以解码形式表示的控制序列,返回值中可能包含部分百分比编码序列。

另请参阅 path()。

QString QUrl::fragment(QUrl::ComponentFormattingOptions options = PrettyDecoded) const

返回 URL 的片段。要确定解析后的 URL 是否包含片段,请使用 `hasFragment()`。

options 参数控制片段组件的格式化方式。所有值均会产生无歧义的结果。当设置为QUrl::FullyDecoded 时,所有百分比编码序列都会被解码;否则,对于QString 中无法以解码形式表示的某些控制序列,返回值可能包含部分百分比编码序列。

请注意,如果存在此类无法表示的序列,QUrl::FullyDecoded 可能会导致数据丢失。建议仅在结果用于非URL上下文时使用该值。

另请参阅 setFragment() 和hasFragment()。

[static, since 6.3] QString QUrl::fromAce(const QByteArray &domain, QUrl::AceProcessingOptions options = {})

返回给定域名domain 的 Unicode 形式,该域名采用 ASCII 兼容编码(ACE)进行编码。可以通过在调用options 时传递标志来自定义输出。该函数的结果被视为与domain 等价。

如果domain 中的值无法编码,则将其转换为QString 并返回。

ASCII 兼容编码(ACE)由 RFC 3490、RFC 3491 和 RFC 3492 定义,并由 Unicode 技术标准第 46 号更新。 它是“应用程序中的域名国际化”(IDNA)规范的一部分,该规范允许使用非 US-ASCII 字符来书写域名(如"example.com" )。

该函数在 Qt 6.3 中引入。

[static] QUrl QUrl::fromCFURL(CFURLRef url)

构建一个包含 CFURLurl 副本的 `QUrl `。

[static] QUrl QUrl::fromEncoded(QByteArrayView input, QUrl::ParsingMode mode = TolerantMode)

解析input 并返回相应的QUrl 。input 被假定为编码形式,仅包含 ASCII 字符。

使用mode 解析 URL。有关此参数的更多信息,请参阅setUrl()。在此上下文中不允许使用QUrl::DecodedMode 。

注意:在 Qt 6.7 之前的版本中,此函数接受的是QByteArray ,而非QByteArrayView 。若遇到编译错误,是因为您的代码传递了可隐式转换为QByteArray 但无法转换为QByteArrayView 的对象。请将相应的参数用QByteArray{~~~} 包装,以显式进行类型转换。此做法与旧版 Qt 向后兼容。

另请参阅 toEncoded() 和setUrl()。

[static] QUrl QUrl::fromLocalFile(const QString &localFile)

返回localFile 的QUrl 表示形式,将其解释为本地文件。该函数既接受以斜杠分隔的路径,也接受该平台的原生分隔符。

该函数还接受以双斜杠(或反斜杠)开头的路径,以表示远程文件,例如“//servername/path/to/file.txt”。请注意,只有某些平台才能使用QFile::open()实际打开该文件。

空的localFile 将导致URL为空(自Qt 5.4起)。

qDebug()<<QUrl::fromLocalFile("file.txt");            // QUrl("file:file.txt")
qDebug() << QUrl::fromLocalFile("/home/user/file.txt"); // QUrl("file:///home/user/file.txt")
qDebug() << QUrl::fromLocalFile("file:file.txt");       // doesn't make sense; expects path, not url with scheme

在上文代码片段的第一行中,文件 URL 是根据本地相对路径生成的。仅包含相对路径的文件 URL 只有在存在用于解析它的基 URL 时才有意义。例如:

QUrl url=QUrl::fromLocalFile("file.txt");
QUrl baseUrl=QUrl("file:/home/user/");
// 错误:会输出 QUrl("file:file.txt"),因为 url 已经包含方案
qDebug() << baseUrl.resolved(url);

要解析此类 URL,必须先去除方案:

// 正确:输出 QUrl("file:///home/user/file.txt")
url.setScheme(QString());
qDebug() << baseUrl.resolved(url);

因此,对于相对文件路径,最好使用相对 URL(即不带协议前缀):

QUrl url=QUrl("file.txt");
QUrl baseUrl=QUrl("file:/home/user/");
// 输出 QUrl("file:///home/user/file.txt")
qDebug() << baseUrl.resolved(url);

另请参阅 toLocalFile()、isLocalFile() 和QDir::toNativeSeparators()。

[static] QUrl QUrl::fromNSURL(const NSURL *url)

创建一个包含 NSURLurl 副本的QUrl 。

[static] QString QUrl::fromPercentEncoding(const QByteArray &input)

返回input 的解码副本。首先将input 从百分比编码中解码,然后将其从UTF-8转换为Unicode。

注意:若 输入无效(例如包含字符串“%G5”的字符串,该序列并非有效的十六进制数),则输出也将无效。例如:字符串“%G5”可能被解码为‘W’。

[static] QList<QUrl> QUrl::fromStringList(const QStringList &urls, QUrl::ParsingMode mode = TolerantMode)

使用QUrl(str,mode),将表示urls 的字符串列表转换为 URL 列表。请注意,这意味着所有字符串都必须是 URL,而不能是本地路径等。

[static] QUrl QUrl::fromUserInput(const QString &userInput, const QString &workingDirectory = QString(), QUrl::UserInputResolutionOptions options = DefaultResolution)

如果能够推导出有效URL,则根据用户提供的userInput 字符串返回一个有效URL;否则,返回无效的QUrl()。

这允许用户以纯字符串的形式输入 URL 或本地文件路径。该字符串可以手动输入到地址栏中,从剪贴板获取,或通过命令行参数传递。

当该字符串本身并非有效 URL 时,系统会基于多种假设进行最佳猜测。

如果该字符串对应于系统上的有效文件路径,则使用QUrl::fromLocalFile() 构建一个 file:// URL。

如果不是这种情况,则会尝试将该字符串转换为 http:// 或 ftp:// URL。当字符串以 'ftp' 开头时,则转换为后者。随后,结果将通过QUrl 的容错解析器进行处理;若解析成功,则返回有效的QUrl ;否则返回QUrl()。

示例:

  • qt-project.org 将转换为 http://qt-project.org
  • ftp.qt-project.org 变为 ftp://ftp.qt-project.org
  • hostname 变为 http://hostname
  • /home/user/test.html 变为 file:///home/user/test.html

为了能够处理相对路径,此方法接受一个可选的workingDirectory 路径。这在处理命令行参数时特别有用。如果workingDirectory 为空,则不会进行任何相对路径处理。

默认情况下,只有当文件实际存在于指定的工作目录中时,类似相对路径的输入字符串才会被视为相对路径。如果应用程序能够处理尚未存在的文件,则应在options 中传递AssumeLocalFile 标志。

bool QUrl::hasFragment() const

如果该 URL 包含片段(即 URL 中出现 # 符号),则返回true 。

另请参阅 fragment() 和setFragment()。

bool QUrl::hasQuery() const

如果该 URL 包含查询字符串(即其中出现了“?”),则返回true 。

另请参阅 setQuery()、query() 和hasFragment()。

QString QUrl::host(QUrl::ComponentFormattingOptions options = FullyDecoded) const

如果 URL 已定义,则返回其主机名;否则返回空字符串。

options 参数控制主机名的格式。QUrl::EncodeUnicode 选项将使该函数以ASCII兼容编码(ACE)形式返回主机名,这适用于非8位兼容或需要传统主机名的通道(例如DNS请求或HTTP请求头)。 如果未指定该标志,则该函数将根据允许的顶级域名列表(参见idnWhitelist()),以 Unicode 形式返回国际域名 (IDN)。

所有其他标志均被忽略。主机名不能包含控制字符或百分号,因此返回值可视为已完全解码。

另请参阅 setHost()、idnWhitelist()、setIdnWhitelist() 以及authority()。

[static] QStringList QUrl::idnWhitelist()

返回当前允许其组成中包含非ASCII字符的顶级域名的白名单。

有关此列表的依据,请参阅setIdnWhitelist()。

另请参阅 setIdnWhitelist() 和AceProcessingOption 。

bool QUrl::isEmpty() const

如果 URL 没有数据,则返回true ;否则返回false 。

另请参阅 clear()。

bool QUrl::isLocalFile() const

如果该 URL 指向本地文件路径,则返回 `true `。如果 URL 的方案为“file”,则该 URL 即为本地文件路径。

请注意,即使最终的文件路径无法通过QFile::open() 打开,该函数仍会将包含主机名的 URL 视为本地文件路径。

另请参阅 fromLocalFile() 和toLocalFile()。

bool QUrl::isParentOf(const QUrl &childUrl) const

如果该 URL 是childUrl 的父 URL,则返回true 。如果这两个 URL 具有相同的方案和权限,且该 URL 的路径是childUrl 路径的父路径,则childUrl 是该 URL 的子 URL。

bool QUrl::isRelative() const

如果 URL 是相对的,则返回true ;否则返回false 。如果 URL 的方案未定义,则该 URL 被视为相对引用;因此,此函数等同于调用scheme()。isEmpty()。

相对引用在 RFC 3986 第 4.2 节中进行了定义。

另请参阅 Relative URLs vs Relative Paths 。

bool QUrl::isValid() const

如果 URL 不为空且有效,则返回true ;否则返回false 。

该 URL 将经过符合性测试。URL 的每个部分都必须符合 URI 标准的编码规则,该 URL 才会被判定为有效。

boolcheckUrl(constQUrl&url) {
    if(!url.isValid()) {
        qDebug("Invalid URL: %s", qUtf8Printable(url.toString()));
       return false;
    }

    return true;
}

bool QUrl::matches(const QUrl &url, QUrl::FormattingOptions options) const

如果对该 URL 和给定的url 均应用options 后两者相等,则返回true ;否则返回false 。

这相当于对两个 URL 分别调用adjusted(options),然后比较所得的 URL,但速度更快。

QString QUrl::password(QUrl::ComponentFormattingOptions options = FullyDecoded) const

如果 URL 定义了密码,则返回该密码;否则返回空字符串。

options 参数控制用户名部分的格式化方式。所有取值均会产生明确无误的结果。当设置为QUrl::FullyDecoded 时,所有百分比编码序列都会被解码;否则,对于某些在QString 中无法以解码形式表示的控制序列,返回值可能包含部分百分比编码序列。

请注意,如果存在上述无法表示的序列,使用QUrl::FullyDecoded 可能会导致数据丢失。建议在结果将用于非 URL 上下文时使用该值,例如在QAuthenticator 中进行设置或协商登录时。

另请参阅 setPassword()。

QString QUrl::path(QUrl::ComponentFormattingOptions options = FullyDecoded) const

返回 URL 的路径。

qDebug()<<QUrl("file:file.txt").path();                   // "file.txt"
qDebug() << QUrl("/home/user/file.txt").path();             // "/home/user/file.txt"
qDebug() << QUrl("http://www.example.com/test/123").path(); // "/test/123"

options 参数控制路径组件的格式化方式。所有值都会产生明确无误的结果。当设置为QUrl::FullyDecoded 时,所有百分比编码的序列都会被解码;否则,对于某些在QString 中无法以解码形式表示的控制序列,返回值中可能会包含一些百分比编码的序列。

请注意,如果存在上述无法表示的序列,使用QUrl::FullyDecoded 可能会导致数据丢失。建议在结果将用于非URL上下文(例如发送至FTP服务器)时使用该值。

数据丢失的一个示例是:当存在非Unicode百分比编码序列且使用FullyDecoded (默认值)时:

qDebug() << QUrl("/foo%FFbar").path();

在此示例中,由于%FF 无法被转换,因此会出现一定程度的数据丢失。

当路径中包含子分隔符(例如+ )时,也会发生数据丢失:

qDebug() << QUrl("/foo+bar%2B").path(); // "/foo+bar+"

其他解码示例:

constQUrl url("/tmp/Mambo %235%3F.mp3");
qDebug() << url.path(QUrl::FullyDecoded);  // "/tmp/Mambo #5?.mp3"
qDebug() << url.path(QUrl::PrettyDecoded); // "/tmp/Mambo #5?.mp3"
qDebug() << url.path(QUrl::FullyEncoded);  // "/tmp/Mambo%20%235%3F.mp3"

另请参阅 setPath()。

int QUrl::port(int defaultPort = -1) const

返回 URL 的端口号;如果未指定端口,则返回defaultPort 。

示例:

QTcpSocket sock;
sock.connectToHost(url.host(), url.port(80));

另请参阅 setPort()。

QString QUrl::query(QUrl::ComponentFormattingOptions options = PrettyDecoded) const

如果 URL 中包含查询字符串,则返回该查询字符串;否则返回空结果。要判断解析后的 URL 是否包含查询字符串,请使用 `hasQuery()`。

options 参数控制查询部分的格式化方式。所有值都会产生明确无误的结果。当设置为QUrl::FullyDecoded 时,所有百分比编码的字符串都会被解码;否则,对于某些在QString 中无法以解码形式表示的控制序列,返回值可能仍包含部分百分比编码的字符串。

请注意,不建议在查询中使用QUrl::FullyDecoded ,因为查询通常包含应保持百分比编码形式的数据,包括使用“%2B”序列来表示加号字符('+')。

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

QUrl QUrl::resolved(const QUrl &relative) const

返回将此 URL 与relative 合并后的结果。此 URL 被用作将relative 转换为绝对 URL 的基准。

如果relative 不是相对 URL,则该函数将直接返回relative 。否则,将合并两个 URL 的路径,返回的新 URL 将保留基础 URL 的方案和权威部分,但采用合并后的路径,如下例所示:

QUrl baseUrl("http://qt.digia.com/Support/");
QUrl relativeUrl("../Product/Library/");
qDebug(qUtf8Printable(baseUrl.resolved(relativeUrl).toString()));
// 输出“http://qt.digia.com/Product/Library/”

使用“..”调用 resolved() 会返回一个QUrl ,其目录比原始目录高一级。同样,使用“../..”调用 resolved() 会从路径中移除两级。如果relative 为“/”,则路径变为“/”。

另请参阅 isRelative()。

QString QUrl::scheme() const

返回 URL 的方案。如果返回空字符串,则表示该方案未定义,此时该 URL 为相对 URL。

方案中只能包含 US-ASCII 字母或数字,这意味着它不能包含任何需要进行编码的字符。此外,方案始终以小写形式返回。

另请参阅 setScheme() 和isRelative()。

void QUrl::setAuthority(const QString &authority, QUrl::ParsingMode mode = TolerantMode)

将 URL 的权威部分设置为authority 。

URL 的授权部分由用户信息、主机名和端口组成。所有这些元素均为可选;因此,空的授权部分也是有效的。

用户信息与主机名之间用“@”分隔,主机名与端口之间用“:”分隔。如果用户信息为空,则必须省略“@”;但如果端口为空,则允许出现孤立的“:”。

以下示例展示了一个有效的权威部分字符串:

一个URL的截图,其中各部分标注为:方案、授权、用户信息(用户名和密码)、主机和端口。

authority 数据根据mode 进行解析:在StrictMode 中,任何 '%' 字符后必须紧跟 exactly two hexadecimal characters,且某些字符(包括空格)不允许以未编码形式出现。 在TolerantMode (默认值)中,所有字符均可采用未解码形式,且容错解析器会自动修正未紧跟两个十六进制字符的孤立“%”字符。

此函数不允许将mode 设置为QUrl::DecodedMode 。要设置完全解码的数据,请分别调用setUserName()、setPassword()、setHost() 和setPort()。

另请参阅 authority()、setUserInfo()、setHost() 以及setPort() 函数。

void QUrl::setFragment(const QString &fragment, QUrl::ParsingMode mode = TolerantMode)

将 URL 的片段设置为fragment 。片段是 URL 的最后一部分,由“#”后跟一串字符表示。它通常在 HTTP 中用于指代页面上的某个链接或位置:

一个URL的截图,其中片段已被高亮显示

片段有时也被称为 URL 的“引用”。

传递 QString() 类型的参数(即空的QString )将清除片段。传递QString ("")类型的参数(即空的但非空的QString )将把片段设置为空字符串(如同原始 URL 仅包含一个“#”)。

fragment 数据的解析遵循mode 的规则:在StrictMode 中,任何 '%' 字符后必须紧跟两个十六进制字符,且某些字符(包括空格)不允许以未编码形式出现。在TolerantMode 中,所有字符均以未编码形式被接受,且容错解析器会修正那些未紧跟两个十六进制字符的孤立 '%' 字符。 在DecodedMode 中,'%' 代表其本身,且不允许出现编码字符。

QUrl::DecodedMode 当从非 URL 的数据源设置片段,或者使用fragment() 并配合QUrl::FullyDecoded 格式化选项获取片段时,应使用此参数。

另请参阅 fragment() 和hasFragment()。

void QUrl::setHost(const QString &host, QUrl::ParsingMode mode = DecodedMode)

将 URL 的主机设置为host 。主机是权威域的一部分。

host 数据的解析遵循mode 的规定:在StrictMode 中,任何 '%' 字符后必须紧跟恰好两个十六进制字符,且某些字符(包括空格)不允许以未编码形式出现。在TolerantMode 中,所有字符均以未编码形式被接受,且宽容解析器会自动修正那些未紧跟两个十六进制字符的孤立 '%' 字符。 在DecodedMode 中,'%' 代表其本身,且不允许出现编码字符。

请注意,在所有情况下,解析结果都必须是符合 STD 3 规则(经《国际化资源标识符》规范(RFC 3987)修改)的有效主机名。不允许使用无效主机名,否则会导致isValid() 返回 false。

另请参阅 host() 和setAuthority()。

[static] void QUrl::setIdnWhitelist(const QStringList &list)

将允许域名中包含非ASCII字符的顶级域名(TLD)白名单设置为list 。

请注意,若调用此函数,必须在启动任何可能访问idnWhitelist() 的线程之前进行。

Qt 提供了一个默认列表,其中包含已公开支持国际化域名 (IDN) 的互联网顶级域名,以及确保外观相似的字符(例如拉丁小写字母'a' 及其西里尔字母对应字符,在大多数字体中它们在外观上完全相同)之间不会发生混淆的规则。

随着注册商发布新规则,该列表会定期进行维护。

提供此函数是为了方便需要操作该列表以添加或删除顶级域名(TLD)的用户。除测试目的外,不建议更改其值,因为这可能会使用户面临安全风险。

另请参阅 idnWhitelist()。

void QUrl::setPassword(const QString &password, QUrl::ParsingMode mode = DecodedMode)

将该 URL 的密码设置为password 。password 是该 URL 授权部分中用户信息元素的一部分,具体说明请参见setUserInfo()。

password 数据的解析遵循mode 的规定:在StrictMode 中,任何 '%' 字符后必须紧跟恰好两个十六进制字符,且某些字符(包括空格)不允许以未编码形式出现。在TolerantMode 中,所有字符均以未编码形式被接受,且宽容的解析器会自动修正未紧跟两个十六进制字符的孤立 '%' 字符。 在DecodedMode 中,'%' 代表其本身,且不允许出现编码字符。

QUrl::DecodedMode 当从非 URL 的数据源设置密码时,应使用此选项,例如向用户显示的密码对话框,或者通过调用password() 并使用QUrl::FullyDecoded 格式化选项获取的密码。

另请参阅 password() 和setUserInfo()。

void QUrl::setPath(const QString &path, QUrl::ParsingMode mode = DecodedMode)

将 URL 的路径设置为path 。路径是指 URL 中位于域名之后、查询字符串之前的那个部分。

显示了一个URL的截图,其中路径已被高亮标出

对于非层次结构的方案,路径将包含方案声明之后的所有内容,如下例所示:

一个URL的截图,其中邮件路径已被高亮显示

path 数据根据mode 进行解析:在StrictMode 中,任何 '%' 字符后面必须紧跟两个十六进制字符,且某些字符(包括空格)不允许以未编码形式出现。在TolerantMode 中,所有字符均以未编码形式被接受,且容错解析器会修正那些后面未跟两个十六进制字符的孤立 '%' 字符。 在DecodedMode 中,'%' 代表其本身,且不允许出现编码字符。

QUrl::DecodedMode 当从非 URL 的数据源设置路径时,应使用此选项,例如显示给用户的对话框,或者通过调用path() 并使用QUrl::FullyDecoded 格式化选项获得的路径。

另请参阅 path()。

void QUrl::setPort(int port)

将 URL 的端口设置为port 。如setAuthority() 中所述,端口是 URL 授权部分的组成部分。

port 必须在 0 到 65535 之间(包含 0 和 65535)。将端口设置为 -1 表示端口未指定。

另请参阅 port()。

void QUrl::setQuery(const QString &query, QUrl::ParsingMode mode = TolerantMode)

将 URL 的查询字符串设置为query 。

如果需要传递一个不符合键值模式的查询字符串,或者该查询字符串对特殊字符的编码方案与QUrl 建议的不同,此函数会很有用。

将 QString() 的值(即空的QString )传递给query 会完全清除查询字符串。然而,传递QString ("")的值会将查询字符串设置为空值,仿佛原始 URL 中只有一个孤立的“?”一样。

query 数据根据mode 进行解析:在StrictMode 中,任何 '%' 字符后必须紧跟恰好两个十六进制字符,且某些字符(包括空格)不允许以未编码形式出现。在TolerantMode 中,所有字符均以未编码形式被接受,且宽容的解析器会纠正未紧跟两个十六进制字符的孤立 '%' 字符。 在DecodedMode 中,'%' 代表其本身,且不允许出现编码字符。

查询字符串通常包含百分比编码序列,因此不建议使用DecodedMode 。需要注意的一个特殊序列是加号('+')的处理。QUrl 不会将空格转换为加号,尽管网页浏览器提交的 HTML 表单会进行此类转换。 为了在查询中表示真正的加号,通常使用“%2B”这一序列。在TolerantMode 或StrictMode 中,该函数将保留“%2B”序列不变。

另请参阅 query() 和hasQuery()。

void QUrl::setQuery(const QUrlQuery &query)

将 URL 的查询字符串设置为query 。

该函数从QUrlQuery 对象中重建查询字符串,并将其设置到此QUrl 对象上。由于QUrlQuery 包含已经过解析的数据,因此该函数不带解析参数。

这是一个重载函数。

另请参阅 query() 和hasQuery()。

void QUrl::setScheme(const QString &scheme)

将 URL 的方案设置为scheme 。由于方案只能包含 ASCII 字符,因此不会对输入进行任何转换或解码。此外,方案必须以 ASCII 字母开头。

方案描述了 URL 的类型(或协议)。它由 URL 开头的一个或多个 ASCII 字符表示。

方案严格符合RFC 3986 规范:scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )

以下示例展示了一个协议为“ftp”的 URL:

该图示以“ftp://”开头的示例URL为例,突出了“ftp”作为其协议。

要设置方案,请使用以下调用:

QUrl url;
url.setScheme("ftp");

方案也可以为空,此时该 URL 将被解释为相对 URL。

另请参阅 scheme() 和isRelative()。

void QUrl::setUrl(const QString &url, QUrl::ParsingMode parsingMode = TolerantMode)

解析url 并将其值赋给该对象。QUrl 会自动对 URL 中不允许的所有字符进行百分比编码,并对表示非保留字符(字母、数字、连字符、下划线、点和波浪号)的百分比编码序列进行解码。所有其他字符均保持原样。

使用解析模式parsingMode 解析url 。在TolerantMode (默认模式)下,QUrl 将纠正某些错误,特别是百分号('%')后未跟随两个十六进制数字的情况,并且允许任何字符出现在任意位置。 在StrictMode 中,编码错误将不被容忍,且QUrl 还会检查是否存在某些以未编码形式出现的禁止字符。如果在StrictMode 中检测到错误,isValid() 将返回 false。在此上下文中不允许使用解析模式DecodedMode ,这将引发运行时警告。

另请参阅 url() 和toString()。

void QUrl::setUserInfo(const QString &userInfo, QUrl::ParsingMode mode = TolerantMode)

将 URL 的用户信息设置为userInfo 。如setAuthority() 中所述,用户信息是 URL 授权部分的可选组成部分。

用户信息由用户名和可选的密码组成,两者以“:”分隔。如果密码为空,则必须省略冒号。以下示例展示了一个有效的用户信息字符串:

一个URL的截图,其中用户信息已被标出

userInfo 数据将根据mode 进行解析:在StrictMode 中,任何 '%' 字符后必须紧跟恰好两个十六进制字符,且某些字符(包括空格)不允许以未解码形式出现。 在TolerantMode (默认设置)下,所有字符均可以未解码形式接受,且容错解析器会自动修正未紧跟两个十六进制字符的孤立 '%' 字符。

此函数不允许将mode 设置为QUrl::DecodedMode 。要设置完全解码的数据,请分别调用setUserName() 和setPassword()。

另请参阅 userInfo()、setUserName()、setPassword() 和setAuthority()。

void QUrl::setUserName(const QString &userName, QUrl::ParsingMode mode = DecodedMode)

将 URL 的用户名设置为userName 。userName 是 URL 授权部分中用户信息元素的一部分,具体说明请参见setUserInfo()。

userName 数据的解析遵循mode 的规定:在StrictMode 中,任何 '%' 字符后必须紧跟恰好两个十六进制字符,且某些字符(包括空格)不允许以未解码形式出现。 在TolerantMode (默认)中,所有字符均可以未编码形式接受,且容错解析器会修正未紧跟两个十六进制字符的孤立 '%'。在DecodedMode 中,'%' 代表其本身,且不允许使用编码字符。

QUrl::DecodedMode 当从非 URL 数据源设置用户名时,应使用此选项,例如显示给用户的密码对话框,或者通过调用userName() 并使用QUrl::FullyDecoded 格式化选项获取用户名的情况。

另请参阅 userName() 和setUserInfo()。

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

将此网址替换为other 。此操作非常快,且绝不会失败。

[static, since 6.3] QByteArray QUrl::toAce(const QString &domain, QUrl::AceProcessingOptions options = {})

返回给定域名domain 的 ASCII 兼容编码。可通过向options 传递标志来自定义输出。该函数的返回结果被视为与domain 等效。

ASCII 兼容编码(ACE)由 RFC 3490、RFC 3491 和 RFC 3492 定义,并由 Unicode 技术标准第 46 号进行了更新。 它是“应用程序中域名国际化”(IDNA)规范的一部分,该规范允许使用非 US-ASCII 字符书写域名(例如"example.com" )。

如果domain 不是有效的主机名,则该函数返回空的QByteArray 。请特别注意,IPv6 字面量不是有效的域名。

该函数于 Qt 6.3 中引入。

CFURLRef QUrl::toCFURL() const

根据QUrl 创建一个CFURL。

调用方拥有该 CFURL,并负责将其释放。

QString QUrl::toDisplayString(QUrl::FormattingOptions options = FormattingOptions(PrettyDecoded)) const

返回 URL 的可读字符串表示形式。可以通过向 `options` 传递标志来自定义输出。选项 `RemovePassword ` 始终处于启用状态,因为密码绝不应显示给用户。

使用默认选项时,生成的QString 结果可随后传递回QUrl ,但初始存在的任何密码都将丢失。

另请参阅 FormattingOptions 、toEncoded() 和toString()。

QByteArray QUrl::toEncoded(QUrl::FormattingOptions options = FullyEncoded) const

如果 URL 有效,则返回其编码后的表示形式;否则返回一个空的 `QByteArray `。可以通过向 `options` 传递标志来自定义输出。

用户信息、路径和片段均被转换为 UTF-8,随后所有非 ASCII 字符均进行百分比编码。主机名使用 Punycode 进行编码。

QString QUrl::toLocalFile() const

返回此 URL 以本地文件路径格式呈现的路径。即使原始 URL 包含反斜杠,返回的路径也将使用正斜杠。

如果该 URL 包含非空的主机名,则会在返回值中按 SMB 网络中的格式进行编码(例如,“//servername/path/to/file.txt”)。

qDebug()<<QUrl("file:file.txt").toLocalFile();            // "file.txt"
qDebug() << QUrl("file:/home/user/file.txt").toLocalFile(); // "/home/user/file.txt"
qDebug() << QUrl("file.txt").toLocalFile();                 // ""; wasn't a local file as it had no scheme

注意:如果该 URL 的路径部分包含非 UTF-8 二进制序列(例如 %80),则该函数的行为未定义。

另请参阅 fromLocalFile() 和isLocalFile()。

NSURL *QUrl::toNSURL() const

根据QUrl 创建一个NSURL。

该 NSURL 将被自动释放。

[static] QByteArray QUrl::toPercentEncoding(const QString &input, const QByteArray &exclude = QByteArray(), const QByteArray &include = QByteArray())

返回input 的编码副本。首先将input 转换为UTF-8,并将所有不在未保留字符组中的ASCII字符进行百分比编码。若要防止字符被百分比编码,请将其传递给exclude ;若要强制对字符进行百分比编码,请将其传递给include 。

“未保留字符”的定义如下:ALPHA / DIGIT / "-" / "." / "_" / "~"

QByteArray ba=QUrl::toPercentEncoding("{a fishy string?}", "{}", "s");
qDebug(ba.constData());
// 输出“{a fi%73hy %73tring%3F}”

QString QUrl::toString(QUrl::FormattingOptions options = FormattingOptions(PrettyDecoded)) const

返回 URL 的字符串表示形式。可以通过向 `options` 传递标志来自定义输出。本函数不允许使用 `QUrl::FullyDecoded ` 选项,因为这会生成模棱两可的数据。

默认格式化选项为PrettyDecoded 。

另请参阅 FormattingOptions 、url() 和setUrl()。

[static] QStringList QUrl::toStringList(const QList<QUrl> &urls, QUrl::FormattingOptions options = FormattingOptions(PrettyDecoded))

使用toString (options )将一个urls 列表转换为一个QString 对象列表。

QString QUrl::url(QUrl::FormattingOptions options = FormattingOptions(PrettyDecoded)) const

返回 URL 的字符串表示形式。可以通过向 `options` 传递标志来自定义输出。本函数不允许使用 `QUrl::FullyDecoded ` 选项,因为这会生成模棱两可的数据。

生成的QString 结果稍后可传回给QUrl 。

toString (带选项)的同义词。

另请参阅 setUrl()、FormattingOptions 、toEncoded() 以及toString()。

QString QUrl::userInfo(QUrl::ComponentFormattingOptions options = PrettyDecoded) const

返回该 URL 的用户信息;如果用户信息未定义,则返回空字符串。

该函数返回一个无歧义的值,其中可能包含仍处于百分比编码状态的字符,以及一些在QString 中无法以解码形式表示的控制序列。

参数options 控制用户信息组件的格式。本函数不允许使用QUrl::FullyDecoded 值。若需获取完全解码的数据,请分别调用userName()和password()。

另请参阅 setUserInfo()、userName()、password() 和authority()。

QString QUrl::userName(QUrl::ComponentFormattingOptions options = FullyDecoded) const

如果 URL 中定义了用户名,则返回该用户名;否则返回空字符串。

options 参数控制用户名部分的格式化方式。所有取值均会产生无歧义的结果。当设置为QUrl::FullyDecoded 时,所有百分比编码序列都会被解码;否则,对于某些在QString 中无法以解码形式表示的控制序列,返回值可能包含部分百分比编码序列。

请注意,如果存在上述无法表示的序列,使用 `QUrl::FullyDecoded ` 可能会导致数据丢失。建议在结果将用于非 URL 场景时使用该值,例如在 `QAuthenticator ` 中进行设置或协商登录。

另请参阅 setUserName() 和userInfo()。

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

将other 通过move赋值给此QUrl 实例。

QUrl &QUrl::operator=(const QString &url)

将指定的url 分配给此对象。

当定义了QT_NO_URL_CAST_FROM_STRING 宏时,此运算符不可用。

[noexcept] QUrl &QUrl::operator=(const QUrl &url)

将指定的url 分配给此对象。

相关非成员

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

如果lhs 和rhs 这两个 URL 不相等,则返回true ;否则返回false 。

另请参阅 matches()。

QDataStream &operator<<(QDataStream &out, const QUrl &url)

将网址url 写入流out ,并返回该流的引用。

另请参阅 QDataStream 运算符的格式。

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

如果lhs 和rhs 这两个 URL 等价,则返回true ;否则返回false 。

另请参阅 matches()。

QDataStream &operator>>(QDataStream &in, QUrl &url)

从流in 将一个 URL 读取到 `url ` 中,并返回该流的引用。

另请参阅 QDataStream 运算符的格式。

宏文档

QT_NO_URL_CAST_FROM_STRING

禁用将QString (或 char *)自动转换为QUrl 的操作。

当您的代码中大量使用QString 表示文件名,且希望将其转换为使用QUrl 以实现网络透明性时,使用此定义进行编译会非常有用。在任何使用QUrl 的代码中,这有助于避免遗漏QUrl::resolved() 调用,以及其他将QString 转换为QUrl 的误用情况。

例如,如果您的代码如下:

url = filename; // probably not what you want

,你可以将其重写为

url = QUrl::fromLocalFile(filename);
url = baseurl.resolved(QUrl(filename));

另请参阅 QT_NO_CAST_FROM_ASCII 。

© 2026 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.