Я пытался построить 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
построен по умолчанию, затем с помощью сеттеров я вообще ничего не могу добавить в него.
В приведенном выше коде, если я раскомментирую последнюю, но одну строку, то вывод будет QUrl("")
, То есть QUrl::setPath
очистить все внутреннее представление QUrl
пример.
Являются ли оба упомянутых поведения нормальными? Или они ошибки?
Я использую Qt 5.7.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 с сеттерами:
QUrl url;
url.setScheme("http");
url.setHost("server.com");
qDebug() << url; // QUrl("http://server.com")
Причина по которой setPath
делает URL-адрес пустым, потому что он плохо сформирован. Путь должен начинаться с косой черты. использование url.setPath("/dir/file.htm");
,
Ура и продолжай бороться!
Других решений пока нет …