Название: [Решено] Qt 4.6.0 QWebFrame + favicon on MSWin
Отправлено: sendevent от Декабрь 10, 2009, 21:29
при использовании 4.5.3 корректно подтягивались фавиконы страничек, не смотря на Note (http://qt.nokia.com/doc/4.5/qtwebkit.html): Web site icons, also known as "FavIcons", are currently not supported on Windows. We plan to address this in a future release.
для 4.6 подобного предупреждения нету (http://qt.nokia.com/doc/4.6/qtwebkit.html) - логично предположить, что и ограничения нету. но фавиконы загружаться перестали. возможно, криво собрался QtWebKit - гляньте плиз, у кого 4.6.0 под виндой, %QTDIR%\demos\browser загружает их?
Название: Re: Qt 4.6.0 QWebFrame + favicon on MSWin
Отправлено: zenden от Декабрь 10, 2009, 21:44
гляньте плиз, у кого 4.6.0 под виндой, %QTDIR%\demos\browser загружает их? нет, не загружает тот, который шёл с 4.5.3 загружал (хотя показывал только со второго раза)
Название: Re: Qt 4.6.0 QWebFrame + favicon on MSWin
Отправлено: sendevent от Декабрь 10, 2009, 23:13
спасибо. в гугле по этому поводу пока тихо - не в курсе, финские тролли что-нибудь конкретное говорят? мож, кому пригодится костыль: 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 можно убрать, просто мне удобнее сконвертить тут.
|