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)