спасибо.
в гугле по этому поводу пока тихо - не в курсе, финские тролли что-нибудь конкретное говорят?
мож, кому пригодится костыль:
winfaviconloader.h:
/*******************************************************************************
**
** file: winfaviconloader.h
**
** class: WinFaviconLoader
**
** description:
** workaround for QtWebKit's problems with handling favicons on windows
**
** 11.12.2009
**
** ewauthor@indatray.com
**
*******************************************************************************/
#ifndef WINFAVICONLOADER_H
#define WINFAVICONLOADER_H
#include <QThread>
#include <QIcon>
class QNetworkReply;
class WinFaviconLoader : public QThread
{
Q_OBJECT
public:
WinFaviconLoader( QObject *pParent = 0);
virtual ~WinFaviconLoader();
bool setTargetUrl( const QString& strDomain );
protected:
QString m_strTargetUrl;
virtual void run();
protected slots:
void slotRecived( QNetworkReply *pReplay );
signals:
void signalIconRecived( const QIcon& icon );
};
#endif //-- WINFAVICONLOADER_H
winfaviconloader.cpp:
/*******************************************************************************
**
** file: winfaviconloader.cpp
**
** class: WinFaviconLoader
**
** description:
** workaround for QtWebKit's problems with handling favicons on windows
**
** 11.12.2009
**
** ewauthor@indatray.com
**
*******************************************************************************/
#include "winfaviconloader.h"
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QPixmap>
WinFaviconLoader::WinFaviconLoader( QObject *pParent )
:QThread( pParent )
{
}
/*virtual*/ WinFaviconLoader::~WinFaviconLoader()
{
}
bool WinFaviconLoader::setTargetUrl( const QString& strDomain )
{
if( !strDomain.isEmpty()
&& QUrl( strDomain ).isValid() )
{
m_strTargetUrl = strDomain;
return true;
}
return false;
}
/*virtual*/ void WinFaviconLoader::run()
{
QUrl url( m_strTargetUrl );
QNetworkRequest myRequest( url );
QNetworkAccessManager networkMgr;
connect( &networkMgr, SIGNAL( finished(QNetworkReply*) ),
this, SLOT( slotRecived(QNetworkReply*) ) );
networkMgr.get( myRequest );
exec();
}
void WinFaviconLoader::slotRecived( QNetworkReply *pReplay )
{
if( pReplay->error() == QNetworkReply::NoError )
{
QPixmap favico;
favico.loadFromData( pReplay->readAll() );
if( !favico.isNull() )
{
emit signalIconRecived( QIcon( favico ) );
}
}
exit(0);
}
использовать можно так:
...
connect( m_pFaviconLoader, SIGNAL( signalIconRecived(const QIcon&) ),
this, SLOT( slotFaviconChanged(const QIcon&) ) );
...
//-- вариант 1 (когда известен только урл целевой страницы, некоторые домены не проходят):
QString strUrl = QString( "http://www.google.com/s2/favicons?domain=%1" ).arg( qUrl.host() );
if( m_pFaviconLoader->setTargetUrl( strUrl ) )
{
m_pFaviconLoader->start();
}
//-- вариант 2 (когда уже получен хтмл целевой страницы):
QWebElementCollection headerLinks = getView()->page()->mainFrame()->findAllElements("head link");
if( headerLinks.count() )
{
foreach( QWebElement link, headerLinks )
{
QString strRel = link.attribute( "rel" );
if( !strRel.compare( "SHORTCUT ICON", Qt::CaseInsensitive ) )
{
QString strFavicoUrl = link.attribute( "href" );
createAbsoluteUrl( strFavicoUrl ); //-- пока хз как :)
if( m_pFaviconLoader->setTargetUrl( strFavicoUrl ) )
{
m_pFaviconLoader->start();
}
break;
}
}
}
возню с конвертацией QPixmap->QIcon можно убрать, просто мне удобнее сконвертить тут.