QT5读取及修改cookie简单样例

介于网上(中文网页)没有一篇完整的关于QT5读写cookie的简单案例,特有此篇。

①准备工作,定义cookie控制器
在开始获取cookie之前我们需要做一些准备工作,先在mainwindow下拖出一个webview,这里不上图了,以后会比较少上图,有些图华而不实,文字看得懂的自然都看得懂。
之后给这个webview定义一个networkAccessManager,#include什么的这些常识问题大家自己F1。

1
2
3
4
5
6
7
8
9
10
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    _cookieJar = new MyCookieJar();
    //这里设置networkAccessManager
    ui->webView->page()->networkAccessManager()->setCookieJar( _cookieJar );

}

上文中的_cookieJar是我们自己定义的一个MyCookieJar类,继承了QT自带的QNetworkCookieJar。
这里我自己封装了一些方法也放出来吧:

MyCookieJar.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef MYCOOKIEJAR_H
#define MYCOOKIEJAR_H
#include <QNetworkCookieJar>
#include <QNetworkCookie>
#include <QNetworkRequest>
class MyCookieJar : public QNetworkCookieJar
{
    Q_OBJECT
public:
    explicit MyCookieJar(QObject *parent = 0);

    QList<QNetworkCookie> getCookies();
    void setCookies(const QList<QNetworkCookie>& cookieList);
    void addCookies(QString name,QString value);
    void changeCookie(QString name,QString value);
};
#endif // MYCOOKIEJAR_H

MyCookieJar.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "mycookiejar.h"

MyCookieJar::MyCookieJar(QObject *parent) :
    QNetworkCookieJar(parent)
{
}


QList<QNetworkCookie> MyCookieJar::getCookies()

{
    return  this->allCookies();
}

void MyCookieJar::setCookies(const QList<QNetworkCookie>& cookieList)
{
    if(this == NULL)
        return;
    this->setAllCookies(cookieList);
}

void MyCookieJar::addCookies(QString name,QString value)
{
    QNetworkCookie cookie(name.toUtf8(),value.toUtf8());
    this->insertCookie(cookie);
}

void MyCookieJar::changeCookie(QString name,QString value)
{
    QNetworkCookie cookie(name.toUtf8(),value.toUtf8());
    this->updateCookie(cookie);

}


之后我们自定义的这个cookieJar将会一直伴随着整个webview,直到我们换掉它。
到此准备工作就已完毕。

②获取cookie
获取cookie的方法比较简单,先看代码:

1
2
3
4
5
6
7
    QList<QNetworkCookie> list = _cookieJar->getCookies();
    QNetworkCookie cookie;
    foreach (cookie ,list)
    {
        qDebug()<< cookie.name();
        qDebug()<< cookie.value();
    }

先定义一个list用于存储cookie队列(因为可能会有多个cookie),之后foreach遍历一下打印出来即可,QNetworkCookieJar::allCookies()方法即返回一个QList

③修改cookie
修改cookie需要用到MyCookieJar::changeCookie(QString name,QString value)方法,这个是我自定义的,下一层方法是QNetworkCookieJar::updateCookie(const QNetworkCookie &cookie)。
与之相应的还有添加cookie,这里就不说用法了,直接使用相应函数即可。

④带cookie打开一个页面
在上述准备完备的前提下,使用如下代码:

1
2
_cookieJar->setCookiesFromUrl(list,QUrl("http://beitown.com/index.php"));
ui->webView->load(QUrl("http://beitown.com/index.php"));

注意第一句setCookiesFromUrl一定不可少,另外最好使用AddCookie方法(注意不是修改,没有该cookie.name时是无法修改该name的cookie值的),其他有如添加了cookie无法通过验证的属于逻辑情况,和QT本身无关了,请自行分析目标网页的cookie验证机制。

以上即一个关于QT5获取及修改cookie的最简样例,大家可以根据我提供的MyCookieJar类自行添加封装一些新的方法,欢迎大家举一反三。
本篇到此,谢谢关注。

BeiTown
2014.07.03

本文链接:QT5读取及修改cookie简单样例

转载声明:BeiTown原创,转载请注明来源:BeiTown's Coder 编码之源,谢谢


Tags: , , , , ,

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>