2014-07-25 5 views
2

섹션 유지를 위해 Qtwebkit 기반 브라우저에서 지속성을 구현하려고합니다. QNetworkCookieJar를 확장했습니다. 나는 파일을 오버라이드하지 않았지만 저장 및로드 기능 만 추가했습니다. 함수는 explisitly라고 불린다. 다음 오류가 발생합니다. 이 코드는 Qt5.1 예제의 브라우저 코드에서 가져온 것입니다.Qtwebkit persistence 쿠키가 작동하지 않습니다.

QVariant::save: unable to save type 'QList<QNetworkCookie>' (type id: 1038). 

내가 잘못 어떤 일을하고 있습니까 ... ... 도움말 QNetworkCookie 내 구현을 첨부하시기 바랍니다 내가 울부 짖는 코드를 사용하여 CookieJar을 등록

static const unsigned int JAR_VERSION = 23; 
#if 1 
QT_BEGIN_NAMESPACE 

QDataStream &operator<<(QDataStream &stream, const QList<QNetworkCookie> &list) 
{ 
    stream << JAR_VERSION; 
    stream << quint32(list.size()); 
    for (int i = 0; i < list.size(); ++i) 
     stream << list.at(i).toRawForm(); 
    return stream; 
} 

QDataStream &operator>>(QDataStream &stream, QList<QNetworkCookie> &list) 
{ 
    list.clear(); 

    quint32 version; 
    stream >> version; 

    if (version != JAR_VERSION) 
     return stream; 

    quint32 count; 
    stream >> count; 
    for(quint32 i = 0; i < count; ++i) 
    { 
     QByteArray value; 
     stream >> value; 
     QList<QNetworkCookie> newCookies = QNetworkCookie::parseCookies(value); 
     if (newCookies.count() == 0 && value.length() != 0) { 
      qWarning() << "CookieJar: Unable to parse saved cookie:" << value; 
     } 
     for (int j = 0; j < newCookies.count(); ++j) 
      list.append(newCookies.at(j)); 
     if (stream.atEnd()) 
      break; 
    } 
    return stream; 
} 
QT_END_NAMESPACE 
#endif 

CookieJar::CookieJar(QObject *parent) 
    : QNetworkCookieJar(parent) 
{ 
    load(); 
} 

CookieJar::~CookieJar() 
{ 
    save(); 
} 

void CookieJar::load() 
{ 
    QSettings cookieSettings("./cookies_dir/Browser/cookies.ini", QSettings::IniFormat); 
    setAllCookies(qvariant_cast<QList<QNetworkCookie> >(cookieSettings.value(QLatin1String("cookies")))); 
} 
void CookieJar::save() 
{ 
// purgeOldCookies(); 
    QString directory = "./cookies_dir/Browser"; 
    if (!QFile::exists(directory)) { 
     QDir dir; 
     dir.mkpath(directory); 
    } 
    QSettings cookieSettings(directory + QLatin1String("/cookies.ini"), QSettings::IniFormat); 
    QList<QNetworkCookie> cookies = allCookies(); 
    qWarning("\n\n+=======================================================+\n\n"); 
    for (int i = cookies.count() - 1; i >= 0; --i) { 
     qWarning()<< cookies.at(i).domain(); 
     qWarning()<< cookies.at(i).name(); 
     if (cookies.at(i).isSessionCookie()) 
      cookies.removeAt(i); 
    } 
    qWarning("\n\n+=======================================================+\n\n"); 

    cookieSettings.setValue(QLatin1String("cookies"), QVariant::fromValue<QList<QNetworkCookie> >(cookies)); 
} 

void CookieJar::purgeOldCookies() 
{ 
    QList<QNetworkCookie> cookies = allCookies(); 
    if (cookies.isEmpty()) 
     return; 
    int oldCount = cookies.count(); 
    QDateTime now = QDateTime::currentDateTime(); 
    for (int i = cookies.count() - 1; i >= 0; --i) { 
     if (!cookies.at(i).isSessionCookie() && cookies.at(i).expirationDate() < now) 
      cookies.removeAt(i); 
    } 
    if (oldCount == cookies.count()) 
     return; 
    setAllCookies(cookies); 
} 

bool CookieJar::setCookiesFromUrl(const QList<QNetworkCookie> &cookieList, const QUrl &url) 
{ 
    qWarning()<< url; 
    return QNetworkCookieJar::setCookiesFromUrl(cookieList, url); 
} 

우는 소리입니다.

jar = new CookieJar(this); 
    webView->page()->networkAccessManager()->setCookieJar(jar); 

답변

0

QSettings로 저장하거나로드하기 전에 qRegisterMetaTypeStreamOperators<QList<QNetworkCookie>>("QList<QNetworkCookie>")으로 전화해야합니다.

0

qRegisterMetaTypeStreamOperators을 사용해야하며 스트림 운영자를 정의합니다.

다음은 QList < QNetworkCookie> 쿠키를 저장하는 예입니다. 헤더에서 스트림 연산자를 선언

CookieJar::CookieJar(QObject* parent) : 
    QNetworkCookieJar(parent) 
{ 
    qRegisterMetaTypeStreamOperators<QNetworkCookie>("QNetworkCookie"); 
} 

bool CookieJar::save(const QUrl &url) 
{ 
    QList<QNetworkCookie> cookies = cookiesForUrl(url); 
    QSettings cookieSettings; 
    for(auto cookie : cookies) 
    { 
     cookieSettings.setValue(cookie.name(), QVariant::fromValue(cookie)); 
    } 
} 

bool CookieJar::load(const QUrl &url) 
{ 
    QSettings cookieSettings; 

    // empty list created here 
    QList<QNetworkCookie> cookies; 
    // retrieve all keys from cookies.ini 
    QStringList keys = cookieSettings.allKeys(); 
    for(auto key: keys) 
    { 
     QNetworkCookie cookie = qvariant_cast<QNetworkCookie>(cookieSettings.value(key, QVariant())); 
     cookies.append(cookie); 
    } 
    setCookiesFromUrl(cookies, url); 
    return true; 
} 

QDataStream &operator<<(QDataStream &out, const QNetworkCookie &cookie) 
{ 
    out << cookie.toRawForm(); 
} 

QDataStream &operator>>(QDataStream &in, QNetworkCookie &cookie) 
{ 
    QByteArray raw_data; 
    in >> raw_data; 
    QList<QNetworkCookie> cookies = QNetworkCookie::parseCookies(raw_data); 
    cookie = cookies.at(0); 
} 
:

CPP 파일에서
class cookieJar: public QNetworkCookieJar 
{ 
    bool save(const QUrl& url); 
    bool load(const QUrl& url); 
} 
QDataStream &operator<<(QDataStream &out, const QNetworkCookie &cookie); 
QDataStream &operator>>(QDataStream &in, QNetworkCookie &cookie); 

당신이 그런 짓을