Разбор QUrl в QT 5

у меня есть QUrl как это:

https://www.example.com/index.html#token=SomeToken&user=guest

и я хочу получить значение токена, т.е. SomeToken, Я знаю о методе QUrl::queryItemValue, так что этот код должен работать:

void MainWindow::get_token(QUrl url)
{
url = url.toString().replace("?","#");
QString token = url.queryItemValue("token");
}

но в Qt5 я не могу использовать этот метод, как я могу разобрать URL?

2

Решение

Есть новое QUrlQuery класс в Qt5, новый QUrl пока не поддерживает этот метод, поэтому вы должны использовать QUrlQuery для разбора (у него есть этот и другие методы). использование

QUrlQuery query(url);
qDebug() << query.queryItemValue("token");

Примечание: будьте осторожны с replace так как QUrlQuery дает правильный результат с

?token=SomeToken не #token=SomeToken

http://qt-project.org/doc/qt-5/qurlquery.html

3

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

QUrlQuery метод queryItemValue не работает должным образом в Qt 5.9 Поэтому я написал свою собственную функцию для анализа параметров GET

#include <QCoreApplication>
#include <QUrlQuery>
#include <QDebug>
#include <QMap>
#include <QUrl>

QMap<QString,QString> ParseUrlParameters(QString &url)
{
QMap<QString,QString> ret;
if(url.indexOf('?')==-1)
{
return ret;
}

QString tmp = url.right(url.length()-url.indexOf('?')-1);
QStringList paramlist = tmp.split('&');

for(int i=0;i<paramlist.count();i++)
{
QStringList paramarg = paramlist.at(i).split('=');
ret.insert(paramarg.at(0),paramarg.at(1));
}

return ret;
}int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QString url = "http://test1.ru/?token=test&email=test1";

QUrlQuery query(url);
qDebug() << "queryItemValue does not work in Qt 5.9.0 with dynamic QString" << query.queryItemValue("token") << "("<< endl;

qDebug() << "ParseUrlParameters(...) works fine..."<< endl;

QMapIterator<QString, QString> i(ParseUrlParameters(url));
while (i.hasNext())
{
i.next();
qDebug() << i.key() << ":" << i.value();
}

return a.exec();
}

введите описание изображения здесь

0

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