2014-11-03 99 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