diff --git a/src/pdf/api/qpdfsearchmodel.h b/src/pdf/api/qpdfsearchmodel.h index c8190f192f8e52d64d411eaff369eef60af3e2be..cc91e214a423b68f0d5f894ce94238fde0b83a44 100644 --- a/src/pdf/api/qpdfsearchmodel.h +++ b/src/pdf/api/qpdfsearchmodel.h @@ -85,6 +85,7 @@ Q_SIGNALS: protected: void updatePage(int page); + void timerEvent(QTimerEvent *event) override; private: QHash<int, QByteArray> m_roleNames; diff --git a/src/pdf/api/qpdfsearchmodel_p.h b/src/pdf/api/qpdfsearchmodel_p.h index 0855bc2167b4319ff72908047034f236f6f505ad..2a23706b2d450d019dbec2ff3ad93d1eb06c4bf5 100644 --- a/src/pdf/api/qpdfsearchmodel_p.h +++ b/src/pdf/api/qpdfsearchmodel_p.h @@ -77,6 +77,8 @@ public: QVector<bool> pagesSearched; QVector<QVector<QPdfSearchResult>> searchResults; int rowCountSoFar = 0; + int updateTimerId = -1; + int nextPageToUpdate = 0; }; QT_END_NAMESPACE diff --git a/src/pdf/qpdfsearchmodel.cpp b/src/pdf/qpdfsearchmodel.cpp index aa19af5b128b178473299e55c03d85907be52a09..4129c7cb789ea66bce8e7540667ce0258ed7ca74 100644 --- a/src/pdf/qpdfsearchmodel.cpp +++ b/src/pdf/qpdfsearchmodel.cpp @@ -51,6 +51,7 @@ QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(qLcS, "qt.pdf.search") +static const int UpdateTimerInterval = 100; static const int ContextChars = 20; static const double CharacterHitTolerance = 6.0; @@ -164,12 +165,27 @@ void QPdfSearchModel::setDocument(QPdfDocument *document) d->clearResults(); } +void QPdfSearchModel::timerEvent(QTimerEvent *event) +{ + Q_D(QPdfSearchModel); + if (event->timerId() != d->updateTimerId) + return; + if (!d->document || d->nextPageToUpdate >= d->document->pageCount()) { + if (d->document) + qCDebug(qLcS, "done updating search results on %d pages", d->searchResults.count()); + killTimer(d->updateTimerId); + d->updateTimerId = -1; + } + d->doSearch(d->nextPageToUpdate++); +} + QPdfSearchModelPrivate::QPdfSearchModelPrivate() { } void QPdfSearchModelPrivate::clearResults() { + Q_Q(QPdfSearchModel); rowCountSoFar = 0; searchResults.clear(); pagesSearched.clear(); @@ -180,6 +196,8 @@ void QPdfSearchModelPrivate::clearResults() searchResults.resize(0); pagesSearched.resize(0); } + nextPageToUpdate = 0; + updateTimerId = q->startTimer(UpdateTimerInterval); } bool QPdfSearchModelPrivate::doSearch(int page)