详细说明
QUrl类提供了使用URL的便捷接口。
它可以解析和构造编码和未编码形式的URL。 QUrl还支持国际化域名(IDN)。
使用QUrl的最常见方法是通过构造函数通过传递QString对其进行初始化。否则,也可以使用setUrl()。
URL可以两种形式表示:已编码或未编码。未编码的表示形式适合显示给用户,但是编码的表示形式通常是您要发送到Web服务器的形式。例如,未编码的URL“ http://bühler.example.com/applicants.xml”将作为“ http://xn–bhler-kva.example.com/List%20of%”发送到服务器。 20applicants.xml”。
也可以通过调用setScheme(),setUserName(),setPassword(),setHost(),setPort(),setPath(),setQuery()和setFragment()来逐个构造URL。还提供了一些便利功能:setAuthority()设置用户名,密码,主机和端口。 setUserInfo()一次设置用户名和密码。
调用isValid()来检查URL是否有效。可以在构造URL的任何时候完成此操作。如果isValid()返回false,则应在继续操作之前清除URL,或通过使用setUrl()解析新URL重新开始。
通过使用QUrlQuery类及其方法QUrlQuery :: setQueryItems(),QUrlQuery :: addQueryItem()和QUrlQuery :: removeQueryItem(),构造查询特别方便。使用QUrlQuery :: setQueryDelimiters()自定义用于生成查询字符串的定界符。
为了方便生成编码的URL字符串或查询字符串,有两个静态函数分别称为fromPercentEncoding()和toPercentEncoding(),它们处理QString对象的百分比编码和解码。
fromLocalFile()通过解析本地文件路径来构造QUrl。 toLocalFile()将URL转换为本地文件路径。
URL的可读格式是通过toString()获取的。此表示形式适合于以未编码形式向用户显示URL。但是,由toEncoded()返回的编码形式仅供内部使用,传递给Web服务器,邮件客户端等。两种格式在技术上都是正确的,并且明确表示相同的URL-实际上,将任何一种格式传递给QUrl的构造函数或setUrl()都会产生相同的QUrl对象。
QUrl符合RFC 3986(统一资源标识符:通用语法)中的URI规范,并包括RFC 1738(统一资源定位器)中的方案扩展。 QUrl中的大小写折叠规则符合RFC 3491(名称准备:国际化域名(IDN)的Stringprep配置文件)。如果语言环境使用UTF-8(IDN要求)对文件名进行编码,则它也与freedesktop.org中的文件URI规范兼容。
相对网址与相对路径
调用isRelative()将返回URL是否相对。相对网址没有方案。例如:
qDebug() << QUrl("main.qml").isRelative(); // true: no scheme
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包含相对路径时可以是绝对的,反之亦然:
// Absolute URL, relative path
QUrl url("file:file.txt");
qDebug() << url.isRelative(); // false: has "file" scheme
qDebug() << QDir::isAbsolutePath(url.path()); // false: relative path
// Relative URL, absolute path
url = QUrl("/home/user/file.txt");
qDebug() << url.isRelative(); // true: has no scheme
qDebug() << QDir::isAbsolutePath(url.path()); // true: absolute path
可以通过将相对URL作为参数传递给resolve()来解析,该URL返回绝对URL。 isParentOf()用于确定一个URL是否是另一个URL的父级。