Конструкция 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 (»HTTP: //[email protected]: 81 / путь ключ1 = значение1&ключ2 = значение2&ключ3 = значение3 # фрагмент«)

Прежде всего, если QUrl построен по умолчанию, затем с помощью сеттеров я вообще ничего не могу добавить в него.

В приведенном выше коде, если я раскомментирую последнюю, но одну строку, то вывод будет QUrl(""), То есть QUrl::setPath очистить все внутреннее представление QUrl пример.

Являются ли оба упомянутых поведения нормальными? Или они ошибки?

Я использую Qt 5.7.1.

Кажется, что простая конкатенация строк гораздо менее подвержена ошибкам.

0

Решение

Чтобы ответить хотя бы на некоторые ваши вопросы:

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");,

Ура и продолжай бороться!

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]