• 5036阅读
  • 2回复

网页icon的缓冲读取,很明显的是不合理的。 [复制链接]

上一主题 下一主题
离线firerun
 

只看楼主 倒序阅读 楼主  发表于: 2013-01-16
首先向大家说明一下相关的函数
static void QWebSettings::setIconDatabasePath(const QString &location); // 指定肖像数据库保存的本地路径
static QIcon QWebSettings::iconForUrl(const QUrl &url); // 返回关联url的肖像
QIcon QWebView::icon(); // 返回网页的肖像
//signal
void QWebView::iconChanged(); // 网页肖像改变的信号
下面请看几个不同的流程:
  1. // 下面的程序主要测试打开相应的网页的情况下 IconForUrl() 的异步工作模式
  2. // 在 iconChanged() 被触发的情况下,可以显示2次百度网站的肖像,输出是这样的
  3. /* icon changed
  4.    valid icon
  5.    valid icon
  6. */
  7. // 在 iconChanged() 未被触发的情况下,只有第二次能够正确显示百度肖像,输出是这样的
  8. /* null icon
  9.    valid icon
  10. */
  11. // 得出的结论是这样的:这个异步模式必须有一个触发信号,
  12. //                     要么是 iconChanged() ,要么是本地数据库读取成功(猜想的)
  13. #include <QApplication>
  14. #include <QtWebKit/QWebSettings>
  15. #include <QtWebKit/QWebView>
  16. #include <QPushButton>
  17. #include <qDebug>
  18. class Printer : public QObject
  19. {
  20.     Q_OBJECT
  21. public slots:
  22.     void iconchanged() {qDebug() << "icon changed";}
  23.     void printIcon(const QIcon &icon)
  24.     {
  25.         if (icon.isNull()) {qDebug() << "null icon";}
  26.         else {qDebug() << "valid icon";}
  27.     }
  28. };
  29. int main(int argc, char *argv[])
  30. {
  31.     QApplication app(argc, argv);
  32.     QWebSettings::setIconDatabasePath(".");
  33.     QUrl douban("http://www.douban.com/");
  34.     QUrl baidu("http://www.baidu.com/");
  35.     //run this for only once and then comment it out.
  36.     Printer printer;
  37.     QWebView view;
  38.     QObject::connect(&view, SIGNAL(iconChanged()), &printer, SLOT(iconchanged()));
  39.     view.load(baidu);
  40.     view.show();
  41.     app.exec();
  42.     QIcon icon = QWebSettings::iconForUrl(baidu);
  43.     printer.printIcon(icon);
  44.     QPushButton button;
  45.     button.setIcon(icon);
  46.     button.show();
  47.     app.exec();
  48.     icon = QWebSettings::iconForUrl(baidu);
  49.     printer.printIcon(icon);
  50.     button.setIcon(icon);
  51.     button.show();
  52.     return app.exec();
  53. }
  54. #include "main.moc"

  1. // 下面的程序主要测试未打开相应的网页的情况下 IconForUrl() 的异步工作模式
  2. // 第一次显示蓝色的圆形肖像,第二次不显示
  3. /* icon changed
  4.    valid icon
  5.    null icon
  6. */
  7. // 这里有2个疑问:不打开网页就读取不到网页的肖像?不是从本地数据缓冲读的吗?
  8. //                为什么第一个能返回一个默认的肖像而第二次返回的是NULL?
  9. #include <QApplication>
  10. #include <QtWebKit/QWebSettings>
  11. #include <QtWebKit/QWebView>
  12. #include <QPushButton>
  13. #include <qDebug>
  14. class Printer : public QObject
  15. {
  16.     Q_OBJECT
  17. public slots:
  18.     void iconchanged() {qDebug() << "icon changed";}
  19.     void printIcon(const QIcon &icon)
  20.     {
  21.         if (icon.isNull()) {qDebug() << "null icon";}
  22.         else {qDebug() << "valid icon";}
  23.     }
  24. };
  25. int main(int argc, char *argv[])
  26. {
  27.     QApplication app(argc, argv);
  28.     QWebSettings::setIconDatabasePath(".");
  29.     QUrl douban("http://www.douban.com/");
  30.     QUrl baidu("http://www.baidu.com/");
  31.     //run this for only once and then comment it out.
  32.     Printer printer;
  33. //    QWebView view;
  34. //    QObject::connect(&view, SIGNAL(iconChanged()), &printer, SLOT(iconchanged()));
  35. //    view.load(baidu);
  36. //    view.show();
  37. //    app.exec();
  38.     QIcon icon = QWebSettings::iconForUrl(baidu);
  39.     printer.printIcon(icon);
  40.     QPushButton button;
  41.     button.setIcon(icon);
  42.     button.show();
  43.     app.exec();
  44.     icon = QWebSettings::iconForUrl(baidu);
  45.     printer.printIcon(icon);
  46.     button.setIcon(icon);
  47.     button.show();
  48.     return app.exec();
  49. }
  50. #include "main.moc"

  1. // 下面的程序主要测试 QWebView::icon() 的有效性
  2. // 在 iconChanged() 被触发的情况下,可以显示2次百度网站的肖像,输出是这样的
  3. /* icon changed
  4.    valid icon
  5.    valid icon
  6. */
  7. // 在 iconChanged() 未被触发的情况下,只有第二次能够正确显示百度肖像,输出是这样的
  8. /* null icon
  9.    valid icon
  10. */
  11. // 得出的结论是这样的:这个异步模式必须有一个触发信号,
  12. //                     要么是 iconChanged() ,要么是本地数据库读取成功(猜想的)
  13. #include <QApplication>
  14. #include <QtWebKit/QWebSettings>
  15. #include <QtWebKit/QWebView>
  16. #include <QPushButton>
  17. #include <qDebug>
  18. class Printer : public QObject
  19. {
  20.     Q_OBJECT
  21. public slots:
  22.     void iconchanged() {qDebug() << "icon changed";}
  23.     void printIcon(const QIcon &icon)
  24.     {
  25.         if (icon.isNull()) {qDebug() << "null icon";}
  26.         else {qDebug() << "valid icon";}
  27.     }
  28. };
  29. int main(int argc, char *argv[])
  30. {
  31.     QApplication app(argc, argv);
  32.     QWebSettings::setIconDatabasePath(".");
  33.     QUrl douban("http://www.douban.com/");
  34.     QUrl baidu("http://www.baidu.com/");
  35.     //run this for only once and then comment it out.
  36.     Printer printer;
  37.     QWebView view;
  38.     QObject::connect(&view, SIGNAL(iconChanged()), &printer, SLOT(iconchanged()));
  39.     view.load(baidu);
  40.     view.show();
  41.     app.exec();
  42.     QIcon icon = view.icon();
  43.     printer.printIcon(icon);
  44.     QPushButton button;
  45.     button.setIcon(view.icon());
  46.     button.show();
  47.     app.exec();
  48.     icon = view.icon();
  49.     printer.printIcon(icon);
  50.     button.setIcon(view.icon());
  51.     button.show();
  52.     return app.exec();
  53. }
  54. #include "main.moc"


最大的疑问是:不打开相应的网页,你就无法从本地缓冲获取相应的网页肖像。我觉得这样很不合理。
离线firerun

只看该作者 1楼 发表于: 2013-01-18
自己读数据库,问题解决
  1. QIcon getIconByUrl(const QUrl &url)
  2. {
  3.     static QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  4.     db.setDatabaseName(QWebSettings::iconDatabasePath());
  5.     QPixmap pixmap;
  6.     do
  7.     {
  8.         if (!db.open()) break;
  9.         if (!url.isValid()) break;
  10.         QSqlQuery query(db);
  11.         QString str = QString("SELECT IconData.data FROM IconData WHERE IconData.iconID IN" \
  12.                               "(SELECT iconID FROM IconInfo WHERE IconInfo.url LIKE '%%1%');")
  13.                       .arg(url.host());
  14.         query.exec(str);
  15.         if (query.next()) pixmap.loadFromData(query.value(0).toByteArray());
  16.     } while (0);
  17.     if (pixmap.isNull()) pixmap.load("C:/other/code/browser/default.ico");
  18.     return QIcon(pixmap);
  19. }

离线firerun

只看该作者 2楼 发表于: 2013-01-25
  1. QIcon getIconByUrl(const QUrl &url)
  2. {
  3.     static QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  4.     db.setDatabaseName(QWebSettings::iconDatabasePath());
  5.     QPixmap pixmap;
  6.     do
  7.     {
  8.         if (!db.open()) break;
  9.         if (!url.isValid()) break;
  10.         QSqlQuery query(db);
  11.         QString str = QString("SELECT IconData.data FROM IconData WHERE IconData.iconID IN" \
  12.                               "(SELECT iconID FROM PageURL WHERE PageURL.url LIKE '%%1%');")
  13.                       .arg(url.host());
  14.         query.exec(str);
  15.         if (query.next()) pixmap.loadFromData(query.value(0).toByteArray());
  16.     } while (0);
  17.     if (pixmap.isNull()) pixmap.load(":/icon/default-website.ico");
  18.     return QIcon(pixmap);
  19. }


快速回复
限100 字节
 
上一个 下一个