它可以解析和布局编码和未编码形式的 URLs。QUrl 也支持国际化域名(IDNs)。
详细描述最常见的利用QUrl 的办法是通过布局函数来初始化,通报一个 QString 参数。
QUrl url(\"大众https://github.com/\"大众);

然而,也可以利用 setUrl()
QUrl url;
url.setUrl(\"大众https://github.com/\公众);
也可以逐渐地布局 URL,通过调用 setScheme()、setUserName()、setPassword()、setHost()、setPort()、setPath()、setQuery() 和 setFragment()。一些方便的函数也可供给用:setAuthority() 设置用户名、密码、主机和端口。setUserInfo() 设置用户名和密码。
URLs 可以用两种形式表示:编码或未编码。未编码形式适用于显示给用户,编码形式常日会发送到一个 Web 做事器。例如,未编码的URL \"大众http://bühler.example.com/List of applicants.xml\"大众 将被发送到做事器为 \"大众http://xn--bhler-kva.example.com/List%20of%20applicants.xml\"大众 。
可以利用 toString() 来获取 URL 人类可读的表示。这种表示方法适宜以未编码形式将 URL 显示给用户。然而,编码的形式由 toEncoded() 返回,仅供内部利用,通报给 Web 做事器、邮件客户等。两种形式在技能上精确、明确地表示相同的 URL - 事实上,通报任何一种形式给 QUrl 的布局函数或利用 setUrl() 都将产生相同的 QUrl 工具。
QUrl 符合 RFC 3986 (统一资源标识符:通用的语法)中的 URL 规范,包括 RFC 1738 (统一资源定位器)上钩划的扩展。如果 QUrl 中的折叠规则符合 RFC 3491 ,它还兼容 file URI specification 来自 freedesktop.org,供应利用 UTF-8(IDN 哀求) 本地编码编码的文件名。
RFC 3491 是“Nameprep: A Stringprep Profile for Internationalized Domain Names (IDN)”,描述了如何准备一个国际化域名,包括对一个域名字段进行映射、正规化以及禁止性过滤等等操作。
缺点检讨在 URL 解析或利用单独的 setter 函数(例如:setScheme()、setHost() 或 setPath())设置 URL 的组成部分时,QUrl 能够检测许多缺点。如果解析或 setter 函数成功,任何先前记录的缺点条件将被丢弃。
默认情形下, QUrl 的 setter 函数操作在 QUrl::TolerantMode 解析模式下,这意味着他们接管一些常见缺点和不实数据。解析的另一种办法是 QUrl::StrictMode,这适用于进一步检讨。详见 QUrl::ParsingMode 描述不同的解析模式。
QUrl 只检讨符合规范的 URL。它并不试图验证被处理程序预期的高层协议的 URLs 格式。例如,下面的 URIs 都被 QUrl 认为是有效,纵然在利用时他们不合理:
\"大众http:/filename.html\公众 \公众mailto://example.com\"大众
当解析器碰着缺点时,它通过旗子暗记事宜 isValid() 返回 false,并且 toString() / toEncoded() 返回一个空字符串。如果须要将 URL 未能解析的缘故原由显示给用户,可以通过调用 QUrl 的 errorString() 来得到缺点条件。把稳:这个信息是高度技能性的,可能对付用户没故意义。
QUrl 仅能够记录一个缺点条件。如果找到一个以上缺点,没有定义报告哪个缺点。
字符转换遵照这些原则,以避免在处理 URL 和字符串时,涌现缺点的字符转换:
当从一个 QByteArray 或一个char 创建包含 URL 的 QString 时,记得要用 QString::fromUtf8()。
URL格式scheme
scheme 指定利用的传输协议,它由 URL 起始部分的一个或多个 ASCII 字符表示。scheme 只能包含 ASCII 字符,对输入不做转换或解码,必须以 ASCII 字母开始。
scheme 严格兼容 RFC 3986:scheme = ALPHA ( ALPHA / DIGIT / “+” / “-” / “.” )
协议描述file资源是本地打算机上的文件。格式:file:///,把稳后边应是三个斜杠。ftp通过 FTP 访问资源。格式:FTP://gopher通过 Gopher 协议访问该资源。http通过 HTTP 访问该资源。格式:HTTP://https通过安全的 HTTPS 访问该资源。格式:HTTPS://mailto资源为电子邮件地址,通过 SMTP 访问。格式:mailto:MMS通过支持MMS(流媒体)协议的播放该资源(代表软件:Windows Media Player)。格式:MMS://ed2k通过 支持ed2k(专用下载链接)协议的P2P软件访问该资源(代表软件:电驴)。格式:ed2k://Flashget通过 支持Flashget:(专用下载链接)协议的P2P软件访问该资源(代表软件:快车)。格式: Flashget://thunder通过 支持thunder(专用下载链接)协议的 P2P 软件访问该资源(代表软件:迅雷)。格式: thunder://news通过 NNTP 访问该资源。
下图显示了一个 URL,其 scheme 是 ftp:
<喎�\"大众/kf/ware/vc/\公众 target=\"大众_blank\公众 class=\"大众keylink\"大众>vcD4NCjxwPtKqyejWwyBzY2hlbWWjrMq508PS1M/Ct73KvaO6PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L3A+DQo8cHJlIGNsYXNzPQ==\"大众brush:java;\公众> QUrl url; url.setScheme(\"大众ftp\公众);
Authority
URL 的 authority 由用户信息、主机名和端口组成。所有这些元素都是可选的,纵然 authority 为空,也是有效的。
格式:username:password@hostname:port
用户信息和主机由'@' 分割,主机和端口由 ':'分割 。如果用户信息为空,'@' 必须被省略。只管端口为空时,许可利用 ':'。
host:指存放资源的做事器的域名系统(DNS)主机名或 IP 地址。
port:整数,可选,省略时利用方案的默认端口,各种传输协议都有默认的端口号,如 HTTP 的默认端口为80。如果输入时省略,则利用默认端口号。有时候出于安全或其他考虑,可以在做事器上对端口进行重定义,即采取非标准端口号,此时,URL 中就不能省略端口号这一项。
user info
user info 指用户信息,是 URL 中 authority 可选的一部分。
用户信息包括:用户名和一个可选的密码,由 ':' 分割。 如果密码为空,':'必须被省略。
path
由零或多个 / 隔开的字符串,一样平常用来表示主机上的一个目录或文件地址。在 authority 之后,query 之前。
对付没有层级的 schemes,路径将是 scheme 后的所有部分,像下面这样:
query
query 指查询字符串,可选,用于给动态网页(例如:利用 CGI、ISAPI、PHP/JSP/ASP/ASP、.NET 等技能制作的网页)通报参数,可有多个参数,用 & 隔开,每个参数的名和值用 = 隔开。
构建一个查询尤其方便,请参考:Qt之QUrlQuery
fragment
fragment 指定网络资源中的片断。是 URL 的末了一部分,由'#' 后面跟的字符串表示。常日指的是用于 HTTP 页面上的某个链接或点。
例如:一个网页中有多个名词阐明,可利用 fragment 直接定位到某一名词阐明。
fragment 有时也被称为 URL“引用”。
通报一个 QString()(null 字符串)将取消 fragment 的设置。通报一个参数 QString(“”)(空而非 null 字符串)将 fragment 设置为一个空字符串(和原始 URL 一样,只有一个 \"大众#\公众)。
深入利用相对路径
调用 isRelative() 可以判断 URL 是否是相对的。一个相对的 URL 可以被转变通过将它作为参数通报给 resolved(),会返回一个绝对 URL。isParentOf() 用来确定一个 URL 是否是另一个的 parent。
QUrl resolved(const QUrl &relative) const
如果 relative 不是一个相对 URL,该函数会直接返回 relative。否则,这两个 URL 的路径会进行合并,返回的新 URL 会有 base URL 的 scheme 和 authority。
合并后的路径,就像下面这样:
QUrl baseUrl(\公众http://qt.digia.com/Support/\"大众);QUrl relativeUrl(\公众../Product/Library/\"大众);qDebug(baseUrl.resolved(relativeUrl).toString());// 打印 \"大众http://qt.digia.com/Product/Library/\"大众
调用 resolved() 利用 \"大众..\公众,返回原始目录的上级目录。同样,利用 \"大众../..\"大众 将返回上上一层目录。如果 relative 是 \"大众/\"大众,路径会变成 \公众/\"大众。
用户输入
[static] QUrl fromUserInput(const QString &userInput)
可以被扣除,返回一个 userInput 指定的有效 URL;如果不能,则会返回一个空 QURL。
大多数运用程序,可以浏览网页,许可用户输入一个 URL 形式的大略字符串。此字符串可以手动输入到地址栏,从剪贴板中得到,或者通过命令行参数通报。
当没有一个有效的 URL 字符串时,实行最好的预测,使各种web干系的假设。
当字符串对应系统上的一个有效文件路径时,会布局一个 file:// URL,利用 QUrl::fromLocalFile()。
如果不是这种情形,试图把字符串变成一个 http:// 或 ftp:// URL。这时,后者字符串从以 'ftp' 开始。结果然后通过 QUrl 的 tolerant 解析器通报,如果成功,则会返回一个有效的 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
文件名
QString fileName(ComponentFormattingOptions options = FullyDecoded) const
返回文件的名称,包括目录路径。
把稳:如果这个 QUrl 工具路径以斜杠结束,文件的名称是空的。
如果路径不包含任何斜线,完备返回作为文件名。
示例:
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的编码形式不能表示的一些百分比编码序列。
主机、端口
例如,通过 socket 连接到一个指定 QUrl 包含的主机、端口:
QTcpSocket sock;sock.connectToHost(url.host(), url.port(80));
本地文件
可以利用 fromLocalFile() 布局一个 QUrl,通过通报一个本地文件路径。toLocalFile() 将一个 URL 转换为本地文件路径。
QUrl url = QUrl::fromLocalFile(\"大众E:\\Qt.txt\"大众);// QUrl(\"大众file:///E:/Qt.txt\公众)
百分比编码
为方便天生编码 URL 字符串或查询字符串,有两个静态函数:fromPercentEncoding() 和 toPercentEncoding(),处理编码和解码的百分比 QString 工具。
[static] QByteArray toPercentEncoding(const QString &input, const QByteArray &exclude = QByteArray(), const QByteArray &include = QByteArray())
返回一个编码的输入副本 。输入首先转换为 UTF-8,没有在无限制组中的所有 ASCII 字符是百分比编码的。 为了防止字符变为百分比编码,可以将他们通报给 exclude,为了迫使字符变为百分比编码,将他们通报给 include。
无限制的定义是:ALPHA / DIGIT / “-” / “.” / “_” / “~”
QByteArray ba = QUrl::toPercentEncoding(\公众{a fishy string?}\公众, \公众{}\公众, \公众s\公众);qDebug(ba.constData());// 打印 \"大众{a fi%73hy %73tring%3F}\公众
有效性
构建一个 URL 后,可以在任何时候调用 isValid(),来检讨 URL 的有效性。如果返回 false,该当在连续之前 clear() URL,或通过为 setUrl() 通报一个新的 URL 重新开始。
bool isValid() const
URL 运行通过同等性测试。URL 的每一部分都必须符合 URI 标准的标准编码规则,URL 才是有效的。
bool checkUrl(const QUrl &url) { if (!url.isValid()) { qDebug(QString(\"大众Invalid URL: %1\"大众).arg(url.toString())); return false; } return true;}