diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2022-06-01 22:55:34 +0200 |
---|---|---|
committer | Axel Spoerl <axel.spoerl@qt.io> | 2023-02-16 11:19:37 +0100 |
commit | 9e0c55cf423d2f521a2152020f76c8abab2f33c5 (patch) | |
tree | d35b9a8bb940f3b6fab7a9fd8f2fd8326fe6b9c1 | |
parent | c53fd87cf50e51e338d2f8e54f494a8dbab8d712 (diff) | |
download | qtwebengine-9e0c55cf423d2f521a2152020f76c8abab2f33c5.tar.gz |
Support DecorationRole for icons in QPdfDocument::pageModel
...and begin rendering thumbnails in the widget-based example by adding
a QListView in IconMode.
Change-Id: Ia0f446e48ce868e27cd7d64a3712a7db1b1e618b
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
-rw-r--r-- | examples/pdfwidgets/pdfviewer/mainwindow.cpp | 8 | ||||
-rw-r--r-- | examples/pdfwidgets/pdfviewer/mainwindow.h | 1 | ||||
-rw-r--r-- | examples/pdfwidgets/pdfviewer/mainwindow.ui | 39 | ||||
-rw-r--r-- | src/pdf/qpdfdocument.cpp | 26 |
4 files changed, 73 insertions, 1 deletions
diff --git a/examples/pdfwidgets/pdfviewer/mainwindow.cpp b/examples/pdfwidgets/pdfviewer/mainwindow.cpp index d7527a8d5..f5dae88e1 100644 --- a/examples/pdfwidgets/pdfviewer/mainwindow.cpp +++ b/examples/pdfwidgets/pdfviewer/mainwindow.cpp @@ -49,7 +49,7 @@ MainWindow::MainWindow(QWidget *parent) ui->bookmarkView->setModel(bookmarkModel); connect(ui->bookmarkView, &QAbstractItemView::activated, this, &MainWindow::bookmarkSelected); - ui->tabWidget->setTabEnabled(1, false); // disable 'Pages' tab for now + ui->thumbnailsView->setModel(m_document->pageModel()); ui->pdfView->setDocument(m_document); @@ -150,6 +150,12 @@ void MainWindow::on_actionNext_Page_triggered() nav->jump(nav->currentPage() + 1, {}, nav->currentZoom()); } +void MainWindow::on_thumbnailsView_activated(const QModelIndex &index) +{ + auto nav = ui->pdfView->pageNavigator(); + nav->jump(index.row(), {}, nav->currentZoom()); +} + void MainWindow::on_actionContinuous_triggered() { ui->pdfView->setPageMode(ui->actionContinuous->isChecked() ? diff --git a/examples/pdfwidgets/pdfviewer/mainwindow.h b/examples/pdfwidgets/pdfviewer/mainwindow.h index 2827fb2b6..84b779be1 100644 --- a/examples/pdfwidgets/pdfviewer/mainwindow.h +++ b/examples/pdfwidgets/pdfviewer/mainwindow.h @@ -47,6 +47,7 @@ private slots: void on_actionZoom_Out_triggered(); void on_actionPrevious_Page_triggered(); void on_actionNext_Page_triggered(); + void on_thumbnailsView_activated(const QModelIndex &index); void on_actionContinuous_triggered(); void on_actionBack_triggered(); void on_actionForward_triggered(); diff --git a/examples/pdfwidgets/pdfviewer/mainwindow.ui b/examples/pdfwidgets/pdfviewer/mainwindow.ui index 304d4cfc8..458c5a8c9 100644 --- a/examples/pdfwidgets/pdfviewer/mainwindow.ui +++ b/examples/pdfwidgets/pdfviewer/mainwindow.ui @@ -111,6 +111,45 @@ <attribute name="title"> <string>Pages</string> </attribute> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <property name="leftMargin"> + <number>2</number> + </property> + <property name="topMargin"> + <number>2</number> + </property> + <property name="rightMargin"> + <number>2</number> + </property> + <property name="bottomMargin"> + <number>2</number> + </property> + <item> + <widget class="QListView" name="thumbnailsView"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="iconSize"> + <size> + <width>128</width> + <height>128</height> + </size> + </property> + <property name="movement"> + <enum>QListView::Static</enum> + </property> + <property name="resizeMode"> + <enum>QListView::Adjust</enum> + </property> + <property name="viewMode"> + <enum>QListView::IconMode</enum> + </property> + </widget> + </item> + </layout> </widget> </widget> <widget class="QPdfView" name="pdfView" native="true"> diff --git a/src/pdf/qpdfdocument.cpp b/src/pdf/qpdfdocument.cpp index a6aed4bfe..695b30c59 100644 --- a/src/pdf/qpdfdocument.cpp +++ b/src/pdf/qpdfdocument.cpp @@ -15,6 +15,7 @@ #include <QLoggingCategory> #include <QMetaEnum> #include <QMutex> +#include <QPixmap> #include <QVector2D> #include <QtCore/private/qtools_p.h> @@ -56,6 +57,7 @@ public: { if (!index.isValid()) return QVariant(); + switch (QPdfDocument::PageModelRole(role)) { case QPdfDocument::PageModelRole::Label: return document()->pageLabel(index.row()); @@ -64,6 +66,14 @@ public: case QPdfDocument::PageModelRole::NRoles: break; } + + switch (role) { + case Qt::DecorationRole: + return pageThumbnail(index.row()); + case Qt::DisplayRole: + return document()->pageLabel(index.row()); + } + return QVariant(); } @@ -73,8 +83,24 @@ public: private: QPdfDocument *document() const { return static_cast<QPdfDocument *>(parent()); } + QPixmap pageThumbnail(int page) const + { + auto it = m_thumbnails.constFind(page); + if (it == m_thumbnails.constEnd()) { + auto doc = document(); + auto size = doc->pagePointSize(page); + size.scale(128, 128, Qt::KeepAspectRatio); + // TODO use QPdfPageRenderer for threading? + auto image = document()->render(page, size.toSize()); + QPixmap ret = QPixmap::fromImage(image); + m_thumbnails.insert(page, ret); + return ret; + } + return it.value(); + } QHash<int, QByteArray> m_roleNames; + mutable QHash<int, QPixmap> m_thumbnails; }; QPdfDocumentPrivate::QPdfDocumentPrivate() |