QUrl建筑逐件

时间:2017-04-25 18:42:36

标签: c++ qt url qt5 qurl

我试图逐件构建QUrl

QUrl url{"https://host.org/path"};
url.setScheme("http");
url.setPort(81);
url.setUserName("user");
url.setPassword("password");
url.setHost("server.com");
QUrlQuery urlQuery;
urlQuery.setQueryItems({{"key1", "value1"}, {"key2", "value2"}, {"key3", "value3"}});
url.setQuery(urlQuery);
url.setFragment("fragment");
//url.setPath("dir/file.htm");
qDebug() << url;

输出(途中意外错过密码):

  

QUrl(&#34; http://user@server.com:81/path?key1=value1&key2=value2&key3=value3#fragment&#34)

首先,如果QUrl是默认构造的,那么使用setter我根本无法添加任何内容。

在上面的代码中,如果我取消注释最后一行,则输出变为QUrl("")。那是QUrl::setPath清理QUrl实例的整个内部表示。

这两种行为都是正常的吗?或者他们是错误吗?

我使用Qt 5.7.1。

看起来,简单的字符串连接不容易出错。

1 个答案:

答案 0 :(得分:1)

至少回答一些问题:

qDebug() << url;吃掉密码,这是一件好事。为什么?因为qDebug和朋友经常用来写日志文件并且在日志文件中有密码甚至在控制台上都很糟糕,真的很糟糕。所以默认是qDebug吃掉密码。如果需要,请致电qDebug() << url.toString()。你已被警告;)

为什么QUrl url("server.com"); url.setScheme("http");导致http:server.com的结果是因为在QUrl url("server.com");中“server.com”被解析并被识别为路径而不是主机。

我正在使用5.7.0并使用默认构造的QUrl与setter工作正常:

QUrl url;
url.setScheme("http");
url.setHost("server.com");
qDebug() << url; // QUrl("http://server.com")

setPath使URL为空的原因是因为它格式不正确。路径必须以斜杠开头。使用url.setPath("/dir/file.htm");

干杯并继续战斗!