Russian Qt Forum
Ноябрь 23, 2024, 04:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Qt 4.6.0 QWebFrame + favicon on MSWin  (Прочитано 3448 раз)
sendevent
Гость
« : Декабрь 10, 2009, 21:29 »

при использовании 4.5.3 корректно подтягивались фавиконы страничек, не смотря на Note:
Цитировать
Web site icons, also known as "FavIcons", are currently not supported on Windows. We plan to address this in a future release.
для 4.6 подобного предупреждения нету - логично предположить, что и ограничения нету.
но фавиконы загружаться перестали.
возможно, криво собрался QtWebKit - гляньте плиз, у кого 4.6.0 под виндой, %QTDIR%\demos\browser загружает их?
« Последнее редактирование: Декабрь 10, 2009, 23:16 от sendevent » Записан
zenden
Гость
« Ответ #1 : Декабрь 10, 2009, 21:44 »

Цитировать
гляньте плиз, у кого 4.6.0 под виндой, %QTDIR%\demos\browser загружает их?

нет, не загружает

тот, который шёл с 4.5.3 загружал (хотя показывал только со второго раза)
Записан
sendevent
Гость
« Ответ #2 : Декабрь 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 можно убрать, просто мне удобнее сконвертить тут.
« Последнее редактирование: Декабрь 12, 2009, 22:11 от sendevent » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 20.