【问题标题】:QUrl construction piece by pieceQUrl 逐条构建
【发布时间】:2017-04-25 18:42:36
【问题描述】:

我试着一块一块地构造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("http://user@server.com:81/path?key1=value1&key2=value2&key3=value3#fragment")

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

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

这两种行为都正常吗?还是他们是虫子?

我使用 Qt 5.7.1。

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

【问题讨论】:

  • 如果我写QUrl url("server.com"); url.setScheme("http"); 那么url 包含http:server.comQNetworkAccessManager 告诉我Host not found。这正常吗?

标签: c++ qt url qt5 qurl


【解决方案1】:

至少回答您的一些问题:

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

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

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

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

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

干杯,继续战斗!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 2010-09-08
    • 2018-04-20
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多