Недавно я обнаружил, что могу изменить txt-файл, который хранится в Интернете, и когда я получаю его, используя QHttp , я все еще получаю предыдущую версию. Мой код также использовал QtWebKit , так что, может быть, это как-то связано с проблемой? Или, может быть, мне просто не хватает настройки, которая предотвращает кеширование?
(я использую Qt 4.7.3 под Windows 7 и компилирую с надстройкой Visual Studio 2010)
Я делаю следующее, чтобы QtWebKit ничего не кэшировал -
QWebSettings::globalSettings( )->setAttribute( QWebSettings::PrivateBrowsingEnabled, true );
QWebSettings::globalSettings( )->setAttribute( QWebSettings::LocalContentCanAccessRemoteUrls, true );
QWebSettings::setMaximumPagesInCache( 0 );
QWebSettings::setObjectCacheCapacities( 0, 0, 0 );
QWebSettings::clearMemoryCaches( );
Код, который я использую для загрузки TXT-файла, выглядит следующим образом -
CacheHTML::CacheHTML( QObject* parent, QString urlId, QByteArray* bytes, QString stringUrl ) : QObject( parent ) {
this->urlId = urlId;
QUrl url = QUrl( stringUrl );
http = new QHttp( this );
connect( http, SIGNAL( requestFinished( int, bool )), this, SLOT( Loaded( int, bool )));
pBytes = bytes;
buffer = new QBuffer( pBytes, this );
buffer->open( QIODevice::WriteOnly );
http->setHost( url.host( ));
fetchId = http->get( url.toString( ), buffer );
}
Слот, который я использую для соответствия этому, -
void CacheHTML::Loaded( int id, bool error ) {
if( id != fetchId )
return;
if( error ) {
emit CacheComplete( urlId, false );
return;
}
emit CacheComplete( urlId, true );
}
Но как только он получил txt-файл из Интернета, он, кажется, где-то / как-то его кеширует. Независимо от того, какие изменения я внесу в текстовый файл, при запуске моего кода он все равно буферизует исходный файл.
Я попробовал предложение OrcunC (ниже), но это приводит к получению пустой строки в отличие от содержимого текстового файла -
CacheHTML::CacheHTML( QObject* parent, QString urlId, QByteArray* bytes, QString stringUrl ) : QObject( parent ) {
this->urlId = urlId;
QUrl url = QUrl( stringUrl );
http = new QHttp( this );
connect( http, SIGNAL( requestFinished( int, bool )), this, SLOT( Loaded( int, bool )));
pBytes = bytes;
buffer = new QBuffer( pBytes, this );
buffer->open( QIODevice::WriteOnly );
QHttpRequestHeader header( "GET", url.path( ));
header.setValue( "Cache-Control", "no-cache" );
header.setValue( "Host", url.host( ));
http->setHost( url.host( ));
fetchId = http->request( header );
}
Я также пытался реализовать его другим способом, как показано ниже, но получил те же результаты, что и при кэшировании txt-файла. Даже если проверка QNetworkReply в слоте закончен с атрибутом bool fromCache = reply-> (QNetworkRequest :: SourceIsFromCacheAttribute) .toBool () вернул false .
QNetworkAccessManager* manager = new QNetworkAccessManager( this );
connect( manager, SIGNAL( finished( QNetworkReply* )), this, SLOT( Loaded( QNetworkReply* )));
QNetworkRequest req = QNetworkRequest( QUrl( stringUrl ));
req.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork );
req.setAttribute( QNetworkRequest::CacheSaveControlAttribute, false );
manager->get( req );
Я сейчас нахожусь в тупике, поэтому буду очень признателен всем, кто указывает мне правильное направление.