diff -Nru qupzilla-1.9.0/debian/bzr-builder.manifest qupzilla-1.9.0/debian/bzr-builder.manifest --- qupzilla-1.9.0/debian/bzr-builder.manifest 2016-12-11 01:48:27.000000000 +0000 +++ qupzilla-1.9.0/debian/bzr-builder.manifest 2016-12-12 01:47:10.000000000 +0000 @@ -1,3 +1,3 @@ -# bzr-builder format 0.3 deb-version {debupstream}-0~3310+11 -lp:~gabriel1984sibiu/qupzilla/trunk revid:git-v1:c4804600b2db78d9f3360a28a5e6a63691a9cad3 +# bzr-builder format 0.3 deb-version {debupstream}-0~3315+11 +lp:~gabriel1984sibiu/qupzilla/trunk revid:git-v1:d19f5de7bff8ba128fbc66d3a765889c195843f2 nest-part packaging lp:~gabriel1984sibiu/qupzilla/debian debian debian revid:gabriel1984sibiu@gmail.com-20141023174620-u39plh2ax9vcqr31 diff -Nru qupzilla-1.9.0/debian/changelog qupzilla-1.9.0/debian/changelog --- qupzilla-1.9.0/debian/changelog 2016-12-11 01:48:27.000000000 +0000 +++ qupzilla-1.9.0/debian/changelog 2016-12-12 01:47:10.000000000 +0000 @@ -1,8 +1,8 @@ -qupzilla (1.9.0-0~3310+11~ubuntu15.10.1) wily; urgency=low +qupzilla (1.9.0-0~3315+11~ubuntu15.10.1) wily; urgency=low * Auto build. - -- grevutiu gabriel Sun, 11 Dec 2016 01:48:27 +0000 + -- grevutiu gabriel Mon, 12 Dec 2016 01:47:10 +0000 qupzilla (1.9.0) unstable; urgency=medium diff -Nru qupzilla-1.9.0/src/lib/bookmarks/bookmarkitem.cpp qupzilla-1.9.0/src/lib/bookmarks/bookmarkitem.cpp --- qupzilla-1.9.0/src/lib/bookmarks/bookmarkitem.cpp 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/bookmarks/bookmarkitem.cpp 2016-12-12 01:47:06.000000000 +0000 @@ -70,16 +70,12 @@ return m_children; } -QIcon BookmarkItem::icon() +QIcon BookmarkItem::icon(bool load) { - // Cache icon for 20 seconds - const int iconCacheTime = 20 * 1000; - switch (m_type) { case Url: - if (m_iconTime.isNull() || m_iconTime.elapsed() > iconCacheTime) { - m_icon = IconProvider::iconForUrl(m_url); - m_iconTime.restart(); + if (load && m_icon.isNull()) { + setIcon(IconProvider::iconForUrl(m_url)); } return m_icon; case Folder: @@ -89,6 +85,11 @@ } } +void BookmarkItem::setIcon(const QIcon &icon) +{ + m_icon = icon; +} + QString BookmarkItem::urlString() const { return QString::fromUtf8(m_url.toEncoded()); diff -Nru qupzilla-1.9.0/src/lib/bookmarks/bookmarkitem.h qupzilla-1.9.0/src/lib/bookmarks/bookmarkitem.h --- qupzilla-1.9.0/src/lib/bookmarks/bookmarkitem.h 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/bookmarks/bookmarkitem.h 2016-12-12 01:47:06.000000000 +0000 @@ -50,7 +50,9 @@ BookmarkItem* parent() const; QList children() const; - QIcon icon(); + QIcon icon(bool load = true); + void setIcon(const QIcon &icon); + QString urlString() const; QUrl url() const; diff -Nru qupzilla-1.9.0/src/lib/bookmarks/bookmarksmenu.cpp qupzilla-1.9.0/src/lib/bookmarks/bookmarksmenu.cpp --- qupzilla-1.9.0/src/lib/bookmarks/bookmarksmenu.cpp 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/bookmarks/bookmarksmenu.cpp 2016-12-12 01:47:06.000000000 +0000 @@ -24,6 +24,7 @@ #include "browserwindow.h" #include "qzsettings.h" #include "tabwidget.h" +#include "iconprovider.h" BookmarksMenu::BookmarksMenu(QWidget* parent) : Menu(parent) @@ -78,6 +79,21 @@ } } +void BookmarksMenu::menuAboutToShow() +{ + Q_ASSERT(qobject_cast(sender())); + Menu *menu = static_cast(sender()); + + foreach (QAction *action, menu->actions()) { + BookmarkItem *item = static_cast(action->data().value()); + if (item && item->type() == BookmarkItem::Url && action->icon().isNull()) { + IconProvider::imageForUrlAsync(item->url(), action, [=](const QImage &img) { + action->setIcon(QIcon(QPixmap::fromImage(img))); + }); + } + } +} + void BookmarksMenu::menuMiddleClicked(Menu* menu) { BookmarkItem* item = static_cast(menu->menuAction()->data().value()); @@ -156,6 +172,7 @@ addSeparator(); connect(this, SIGNAL(aboutToShow()), this, SLOT(aboutToShow())); + connect(this, SIGNAL(aboutToShow()), this, SLOT(menuAboutToShow())); connect(this, SIGNAL(menuMiddleClicked(Menu*)), this, SLOT(menuMiddleClicked(Menu*))); } diff -Nru qupzilla-1.9.0/src/lib/bookmarks/bookmarksmenu.h qupzilla-1.9.0/src/lib/bookmarks/bookmarksmenu.h --- qupzilla-1.9.0/src/lib/bookmarks/bookmarksmenu.h 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/bookmarks/bookmarksmenu.h 2016-12-12 01:47:06.000000000 +0000 @@ -42,6 +42,7 @@ void bookmarksChanged(); void aboutToShow(); + void menuAboutToShow(); void menuMiddleClicked(Menu* menu); void bookmarkActivated(); diff -Nru qupzilla-1.9.0/src/lib/bookmarks/bookmarksmodel.cpp qupzilla-1.9.0/src/lib/bookmarks/bookmarksmodel.cpp --- qupzilla-1.9.0/src/lib/bookmarks/bookmarksmodel.cpp 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/bookmarks/bookmarksmodel.cpp 2016-12-12 01:47:06.000000000 +0000 @@ -131,7 +131,7 @@ } case Qt::DecorationRole: if (index.column() == 0) { - return itm->icon(); + return itm->icon(false); } return QVariant(); default: @@ -139,6 +139,23 @@ } } +bool BookmarksModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + BookmarkItem *itm = item(index); + + if (!itm) { + return false; + } + + if (role == IconRole) { + itm->setIcon(value.value()); + emit dataChanged(index, index); + return true; + } + + return false; +} + QVariant BookmarksModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { diff -Nru qupzilla-1.9.0/src/lib/bookmarks/bookmarksmodel.h qupzilla-1.9.0/src/lib/bookmarks/bookmarksmodel.h --- qupzilla-1.9.0/src/lib/bookmarks/bookmarksmodel.h 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/bookmarks/bookmarksmodel.h 2016-12-12 01:47:06.000000000 +0000 @@ -38,11 +38,12 @@ UrlRole = Qt::UserRole + 2, UrlStringRole = Qt::UserRole + 3, TitleRole = Qt::UserRole + 4, - DescriptionRole = Qt::UserRole + 5, - KeywordRole = Qt::UserRole + 6, - VisitCountRole = Qt::UserRole + 7, - ExpandedRole = Qt::UserRole + 8, - SidebarExpandedRole = Qt::UserRole + 9, + IconRole = Qt::UserRole + 5, + DescriptionRole = Qt::UserRole + 6, + KeywordRole = Qt::UserRole + 7, + VisitCountRole = Qt::UserRole + 8, + ExpandedRole = Qt::UserRole + 9, + SidebarExpandedRole = Qt::UserRole + 10, MaxRole = SidebarExpandedRole }; @@ -53,6 +54,7 @@ Qt::ItemFlags flags(const QModelIndex &index) const; QVariant data(const QModelIndex &index, int role) const; + bool setData(const QModelIndex &index, const QVariant &value, int role); QVariant headerData(int section, Qt::Orientation orientation, int role) const; int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; diff -Nru qupzilla-1.9.0/src/lib/bookmarks/bookmarkstools.cpp qupzilla-1.9.0/src/lib/bookmarks/bookmarkstools.cpp --- qupzilla-1.9.0/src/lib/bookmarks/bookmarkstools.cpp 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/bookmarks/bookmarkstools.cpp 2016-12-12 01:47:06.000000000 +0000 @@ -365,6 +365,7 @@ QString title = QFontMetrics(m->font()).elidedText(folder->title(), Qt::ElideRight, 250); m->setTitle(title); m->setIcon(folder->icon()); + QObject::connect(m, SIGNAL(aboutToShow()), receiver, SLOT(menuAboutToShow())); QObject::connect(m, SIGNAL(menuMiddleClicked(Menu*)), receiver, SLOT(menuMiddleClicked(Menu*))); QAction* act = menu->addMenu(m); @@ -389,10 +390,7 @@ Action* act = new Action(menu); QString title = QFontMetrics(act->font()).elidedText(bookmark->title(), Qt::ElideRight, 250); act->setText(title); - IconProvider::imageForUrlAsync(bookmark->url(), act, [=](const QImage &img) { - act->setIcon(QIcon(QPixmap::fromImage(img))); - }); - + act->setIcon(bookmark->icon(false)); act->setData(QVariant::fromValue(static_cast(bookmark))); act->setIconVisibleInMenu(true); diff -Nru qupzilla-1.9.0/src/lib/bookmarks/bookmarkstreeview.cpp qupzilla-1.9.0/src/lib/bookmarks/bookmarkstreeview.cpp --- qupzilla-1.9.0/src/lib/bookmarks/bookmarkstreeview.cpp 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/bookmarks/bookmarkstreeview.cpp 2016-12-12 01:47:06.000000000 +0000 @@ -21,6 +21,7 @@ #include "bookmarkitem.h" #include "bookmarks.h" #include "mainapplication.h" +#include "iconprovider.h" #include #include @@ -288,3 +289,18 @@ } } } + +void BookmarksTreeView::drawRow(QPainter *painter, const QStyleOptionViewItem &options, const QModelIndex &index) const +{ + bool itemIsUrl = BookmarkItem::Type(index.data(BookmarksModel::TypeRole).toInt()) == BookmarkItem::Url; + bool iconLoaded = !index.data(BookmarksModel::IconRole).value().isNull(); + + if (itemIsUrl && !iconLoaded) { + const QPersistentModelIndex idx = index; + IconProvider::imageForUrlAsync(index.data(BookmarksModel::UrlRole).toUrl(), this, [=](const QImage &img) { + model()->setData(idx, QIcon(QPixmap::fromImage(img)), BookmarksModel::IconRole); + }); + } + + QTreeView::drawRow(painter, options, index); +} diff -Nru qupzilla-1.9.0/src/lib/bookmarks/bookmarkstreeview.h qupzilla-1.9.0/src/lib/bookmarks/bookmarkstreeview.h --- qupzilla-1.9.0/src/lib/bookmarks/bookmarkstreeview.h 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/bookmarks/bookmarkstreeview.h 2016-12-12 01:47:06.000000000 +0000 @@ -82,6 +82,8 @@ void mouseDoubleClickEvent(QMouseEvent* event); void keyPressEvent(QKeyEvent* event); + void drawRow(QPainter* painter, const QStyleOptionViewItem &options, const QModelIndex &index) const; + Bookmarks* m_bookmarks; BookmarksModel* m_model; BookmarksFilterModel* m_filter; diff -Nru qupzilla-1.9.0/src/lib/history/historyitem.cpp qupzilla-1.9.0/src/lib/history/historyitem.cpp --- qupzilla-1.9.0/src/lib/history/historyitem.cpp 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/history/historyitem.cpp 2016-12-12 01:47:06.000000000 +0000 @@ -21,7 +21,6 @@ HistoryItem::HistoryItem(HistoryItem* parent) : canFetchMore(false) , m_parent(parent) - , m_iconLoaded(false) , m_startTimestamp(0) , m_endTimestamp(0) { @@ -121,11 +120,6 @@ return (m_startTimestamp != 0); } -bool HistoryItem::iconLoaded() const -{ - return m_iconLoaded; -} - QIcon HistoryItem::icon() const { return m_icon; @@ -134,12 +128,6 @@ void HistoryItem::setIcon(const QIcon &icon) { m_icon = icon; - m_iconLoaded = true; -} - -void HistoryItem::refreshIcon() -{ - m_iconLoaded = false; } void HistoryItem::setStartTimestamp(qint64 start) diff -Nru qupzilla-1.9.0/src/lib/history/historyitem.h qupzilla-1.9.0/src/lib/history/historyitem.h --- qupzilla-1.9.0/src/lib/history/historyitem.h 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/history/historyitem.h 2016-12-12 01:47:06.000000000 +0000 @@ -46,11 +46,9 @@ int indexOfChild(HistoryItem* child); bool isTopLevel() const; - bool iconLoaded() const; QIcon icon() const; void setIcon(const QIcon &icon); - void refreshIcon(); void setStartTimestamp(qint64 start); qint64 startTimestamp() const; @@ -67,7 +65,6 @@ QList m_children; QIcon m_icon; - bool m_iconLoaded; qint64 m_startTimestamp; qint64 m_endTimestamp; diff -Nru qupzilla-1.9.0/src/lib/history/historymenu.cpp qupzilla-1.9.0/src/lib/history/historymenu.cpp --- qupzilla-1.9.0/src/lib/history/historymenu.cpp 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/history/historymenu.cpp 2016-12-12 01:47:06.000000000 +0000 @@ -97,12 +97,16 @@ const QUrl url = query.value(1).toUrl(); const QString title = QzTools::truncatedText(query.value(0).toString(), 40); - Action* act = new Action(IconProvider::iconForUrl(url), title); + Action* act = new Action(title); act->setData(url); connect(act, SIGNAL(triggered()), this, SLOT(historyEntryActivated())); connect(act, SIGNAL(ctrlTriggered()), this, SLOT(historyEntryCtrlActivated())); connect(act, SIGNAL(shiftTriggered()), this, SLOT(historyEntryShiftActivated())); addAction(act); + + IconProvider::imageForUrlAsync(url, act, [=](const QImage &img) { + act->setIcon(QIcon(QPixmap::fromImage(img))); + }); } } @@ -120,12 +124,16 @@ const QVector mostVisited = mApp->history()->mostVisited(10); foreach (const HistoryEntry &entry, mostVisited) { - Action* act = new Action(IconProvider::iconForUrl(entry.url), QzTools::truncatedText(entry.title, 40)); + Action* act = new Action(QzTools::truncatedText(entry.title, 40)); act->setData(entry.url); connect(act, SIGNAL(triggered()), this, SLOT(historyEntryActivated())); connect(act, SIGNAL(ctrlTriggered()), this, SLOT(historyEntryCtrlActivated())); connect(act, SIGNAL(shiftTriggered()), this, SLOT(historyEntryShiftActivated())); m_menuMostVisited->addAction(act); + + IconProvider::imageForUrlAsync(entry.url, act, [=](const QImage &img) { + act->setIcon(QIcon(QPixmap::fromImage(img))); + }); } if (m_menuMostVisited->isEmpty()) { diff -Nru qupzilla-1.9.0/src/lib/history/historymodel.cpp qupzilla-1.9.0/src/lib/history/historymodel.cpp --- qupzilla-1.9.0/src/lib/history/historymodel.cpp 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/history/historymodel.cpp 2016-12-12 01:47:06.000000000 +0000 @@ -105,8 +105,6 @@ return entry.urlString; case IconRole: return item->icon(); - case IconLoadedRole: - return item->iconLoaded(); case IsTopLevelRole: return false; case TimestampStartRole: diff -Nru qupzilla-1.9.0/src/lib/history/historymodel.h qupzilla-1.9.0/src/lib/history/historymodel.h --- qupzilla-1.9.0/src/lib/history/historymodel.h 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/history/historymodel.h 2016-12-12 01:47:06.000000000 +0000 @@ -39,7 +39,6 @@ UrlRole = Qt::UserRole + 3, UrlStringRole = Qt::UserRole + 4, IconRole = Qt::UserRole + 5, - IconLoadedRole = Qt::UserRole + 6, IsTopLevelRole = Qt::UserRole + 7, TimestampStartRole = Qt::UserRole + 8, TimestampEndRole = Qt::UserRole + 9, diff -Nru qupzilla-1.9.0/src/lib/history/historytreeview.cpp qupzilla-1.9.0/src/lib/history/historytreeview.cpp --- qupzilla-1.9.0/src/lib/history/historytreeview.cpp 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/history/historytreeview.cpp 2016-12-12 01:47:06.000000000 +0000 @@ -255,11 +255,13 @@ void HistoryTreeView::drawRow(QPainter* painter, const QStyleOptionViewItem &options, const QModelIndex &index) const { bool itemTopLevel = index.data(HistoryModel::IsTopLevelRole).toBool(); - bool iconLoaded = index.data(HistoryModel::IconLoadedRole).toBool(); + bool iconLoaded = !index.data(HistoryModel::IconRole).value().isNull(); if (index.isValid() && !itemTopLevel && !iconLoaded) { - const QIcon icon = IconProvider::iconForUrl(index.data(HistoryModel::UrlRole).toUrl()); - model()->setData(index, icon, HistoryModel::IconRole); + const QPersistentModelIndex idx = index; + IconProvider::imageForUrlAsync(index.data(HistoryModel::UrlRole).toUrl(), this, [=](const QImage &img) { + model()->setData(idx, QIcon(QPixmap::fromImage(img)), HistoryModel::IconRole); + }); } QTreeView::drawRow(painter, options, index); diff -Nru qupzilla-1.9.0/src/lib/tools/iconprovider.cpp qupzilla-1.9.0/src/lib/tools/iconprovider.cpp --- qupzilla-1.9.0/src/lib/tools/iconprovider.cpp 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/tools/iconprovider.cpp 2016-12-12 01:47:06.000000000 +0000 @@ -159,15 +159,15 @@ return instance()->m_emptyWebImage; } -QIcon IconProvider::iconForUrl(const QUrl &url) +QIcon IconProvider::iconForUrl(const QUrl &url, bool allowEmpty) { - return instance()->iconFromImage(imageForUrl(url)); + return instance()->iconFromImage(imageForUrl(url, allowEmpty)); } -QImage IconProvider::imageForUrl(const QUrl &url) +QImage IconProvider::imageForUrl(const QUrl &url, bool allowEmpty) { if (url.path().isEmpty()) { - return IconProvider::emptyWebImage(); + return allowEmpty ? QImage() : IconProvider::emptyWebImage(); } foreach (const BufferedIcon &ic, instance()->m_iconBuffer) { @@ -187,26 +187,30 @@ return QImage::fromData(query.value(0).toByteArray()); } - return IconProvider::emptyWebImage(); + return allowEmpty ? QImage() : IconProvider::emptyWebImage(); } -void IconProvider::imageForUrlAsync(const QUrl &url, QObject *receiver, std::function callback) +void IconProvider::imageForUrlAsync(const QUrl &url, const QObject *receiver, std::function callback) { QFutureWatcher *watcher = new QFutureWatcher(); connect(watcher, &QFutureWatcher::finished, receiver, [=]() { watcher->deleteLater(); callback(watcher->result()); }); - watcher->setFuture(QtConcurrent::run(imageForUrl, url)); + watcher->setFuture(QtConcurrent::run(imageForUrl, url, false)); } -QIcon IconProvider::iconForDomain(const QUrl &url) +QIcon IconProvider::iconForDomain(const QUrl &url, bool allowEmpty) { - return instance()->iconFromImage(imageForDomain(url)); + return instance()->iconFromImage(imageForDomain(url, allowEmpty)); } -QImage IconProvider::imageForDomain(const QUrl &url) +QImage IconProvider::imageForDomain(const QUrl &url, bool allowEmpty) { + if (url.host().isEmpty()) { + return allowEmpty ? QImage() : IconProvider::emptyWebImage(); + } + foreach (const BufferedIcon &ic, instance()->m_iconBuffer) { if (ic.first.host() == url.host()) { return ic.second; @@ -224,7 +228,7 @@ return QImage::fromData(query.value(0).toByteArray()); } - return QImage(); + return allowEmpty ? QImage() : IconProvider::emptyWebImage(); } IconProvider* IconProvider::instance() diff -Nru qupzilla-1.9.0/src/lib/tools/iconprovider.h qupzilla-1.9.0/src/lib/tools/iconprovider.h --- qupzilla-1.9.0/src/lib/tools/iconprovider.h 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/tools/iconprovider.h 2016-12-12 01:47:06.000000000 +0000 @@ -59,13 +59,13 @@ static QImage emptyWebImage(); // Icon for url (only available for urls in history) - static QIcon iconForUrl(const QUrl &url); - static QImage imageForUrl(const QUrl &url); - static void imageForUrlAsync(const QUrl &url, QObject *receiver, std::function callback); + static QIcon iconForUrl(const QUrl &url, bool allowEmpty = false); + static QImage imageForUrl(const QUrl &url, bool allowEmpty = false); + static void imageForUrlAsync(const QUrl &url, const QObject *receiver, std::function callback); // Icon for domain (only available for urls in history) - static QIcon iconForDomain(const QUrl &url); - static QImage imageForDomain(const QUrl &url); + static QIcon iconForDomain(const QUrl &url, bool allowEmpty = false); + static QImage imageForDomain(const QUrl &url, bool allowEmpty = false); static IconProvider* instance(); diff -Nru qupzilla-1.9.0/src/lib/tools/sqldatabase.cpp qupzilla-1.9.0/src/lib/tools/sqldatabase.cpp --- qupzilla-1.9.0/src/lib/tools/sqldatabase.cpp 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/tools/sqldatabase.cpp 2016-12-12 01:47:06.000000000 +0000 @@ -19,6 +19,7 @@ #include #include +#include #include @@ -54,8 +55,13 @@ return m_databases[thread]; } -QSqlQuery SqlDatabase::exec(const QSqlQuery &query) +QSqlQuery SqlDatabase::exec(QSqlQuery &query) { + if (QThread::currentThread() == qApp->thread()) { + query.exec(); + return query; + } + QSqlQuery out(databaseForThread(QThread::currentThread())); out.prepare(query.lastQuery()); diff -Nru qupzilla-1.9.0/src/lib/tools/sqldatabase.h qupzilla-1.9.0/src/lib/tools/sqldatabase.h --- qupzilla-1.9.0/src/lib/tools/sqldatabase.h 2016-12-11 01:48:24.000000000 +0000 +++ qupzilla-1.9.0/src/lib/tools/sqldatabase.h 2016-12-12 01:47:06.000000000 +0000 @@ -39,7 +39,7 @@ QSqlDatabase databaseForThread(QThread* thread); // Executes query using correct database for current thread - QSqlQuery exec(const QSqlQuery &query); + QSqlQuery exec(QSqlQuery &query); // Executes query asynchronously on one thread from QThreadPool QFuture execAsync(const QSqlQuery &query);