2014-11-03 55 views
1

我有一个QUrl作为这样的:QUrl解析在QT 5

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我不能使用这种方法,我怎么能解析网址是什么?

回答

2

Qt5有新的QUrlQuery类。新的QUrl不支持这种方法,所以你应该使用QUrlQuery进行解析(它有这个和其他方法)。使用

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

注意:要小心与replace因为QUrlQuery为您提供了

?token=SomeToken正确的结果不是一个#token=SomeToken

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

+0

非常感谢,这有助于。 – 2014-11-04 00:09:04

0

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(); 
} 

enter image description here