aboutsummaryrefslogtreecommitdiffstats
path: root/examples/pdfwidgets/pdfviewer/mainwindow.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/pdfwidgets/pdfviewer/mainwindow.py')
-rw-r--r--examples/pdfwidgets/pdfviewer/mainwindow.py141
1 files changed, 141 insertions, 0 deletions
diff --git a/examples/pdfwidgets/pdfviewer/mainwindow.py b/examples/pdfwidgets/pdfviewer/mainwindow.py
new file mode 100644
index 000000000..d37475aca
--- /dev/null
+++ b/examples/pdfwidgets/pdfviewer/mainwindow.py
@@ -0,0 +1,141 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import math
+import sys
+
+from PySide6.QtPdf import QPdfBookmarkModel, QPdfDocument
+from PySide6.QtPdfWidgets import QPdfView
+from PySide6.QtWidgets import (QDialog, QFileDialog, QMainWindow, QMessageBox,
+ QSpinBox)
+from PySide6.QtCore import QModelIndex, QPoint, QStandardPaths, QUrl, Slot
+
+from zoomselector import ZoomSelector
+from ui_mainwindow import Ui_MainWindow
+
+
+ZOOM_MULTIPLIER = math.sqrt(2.0)
+
+
+class MainWindow(QMainWindow):
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.ui = Ui_MainWindow()
+ self.m_zoomSelector = ZoomSelector(self)
+ self.m_pageSelector = QSpinBox(self)
+ self.m_document = QPdfDocument(self)
+ self.m_fileDialog = None
+
+ self.ui.setupUi(self)
+
+ self.m_zoomSelector.setMaximumWidth(150)
+ self.ui.mainToolBar.insertWidget(self.ui.actionZoom_In, self.m_zoomSelector)
+
+ self.ui.mainToolBar.insertWidget(self.ui.actionForward, self.m_pageSelector)
+ self.m_pageSelector.valueChanged.connect(self.page_selected)
+ nav = self.ui.pdfView.pageNavigator()
+ nav.currentPageChanged.connect(self.m_pageSelector.setValue)
+ nav.backAvailableChanged.connect(self.ui.actionBack.setEnabled)
+ nav.forwardAvailableChanged.connect(self.ui.actionForward.setEnabled)
+
+ self.m_zoomSelector.zoom_mode_changed.connect(self.ui.pdfView.setZoomMode)
+ self.m_zoomSelector.zoom_factor_changed.connect(self.ui.pdfView.setZoomFactor)
+ self.m_zoomSelector.reset()
+
+ bookmark_model = QPdfBookmarkModel(self)
+ bookmark_model.setDocument(self.m_document)
+
+ self.ui.bookmarkView.setModel(bookmark_model)
+ self.ui.bookmarkView.activated.connect(self.bookmark_selected)
+
+ self.ui.tabWidget.setTabEnabled(1, False) # disable 'Pages' tab for now
+
+ self.ui.pdfView.setDocument(self.m_document)
+
+ self.ui.pdfView.zoomFactorChanged.connect(self.m_zoomSelector.set_zoom_factor)
+
+ @Slot(QUrl)
+ def open(self, doc_location):
+ if doc_location.isLocalFile():
+ self.m_document.load(doc_location.toLocalFile())
+ document_title = self.m_document.metaData(QPdfDocument.MetaDataField.Title)
+ self.setWindowTitle(document_title if document_title else "PDF Viewer")
+ self.page_selected(0)
+ self.m_pageSelector.setMaximum(self.m_document.pageCount() - 1)
+ else:
+ message = f"{doc_location} is not a valid local file"
+ print(message, file=sys.stderr)
+ QMessageBox.critical(self, "Failed to open", message)
+
+ @Slot(QModelIndex)
+ def bookmark_selected(self, index):
+ if not index.isValid():
+ return
+ page = index.data(int(QPdfBookmarkModel.Role.Page))
+ zoom_level = index.data(int(QPdfBookmarkModel.Role.Level))
+ self.ui.pdfView.pageNavigator().jump(page, QPoint(), zoom_level)
+
+ @Slot(int)
+ def page_selected(self, page):
+ nav = self.ui.pdfView.pageNavigator()
+ nav.jump(page, QPoint(), nav.currentZoom())
+
+ @Slot()
+ def on_actionOpen_triggered(self):
+ if not self.m_fileDialog:
+ directory = QStandardPaths.writableLocation(QStandardPaths.DocumentsLocation)
+ self.m_fileDialog = QFileDialog(self, "Choose a PDF", directory)
+ self.m_fileDialog.setAcceptMode(QFileDialog.AcceptOpen)
+ self.m_fileDialog.setMimeTypeFilters(["application/pdf"])
+ if self.m_fileDialog.exec() == QDialog.Accepted:
+ to_open = self.m_fileDialog.selectedUrls()[0]
+ if to_open.isValid():
+ self.open(to_open)
+
+ @Slot()
+ def on_actionQuit_triggered(self):
+ self.close()
+
+ @Slot()
+ def on_actionAbout_triggered(self):
+ QMessageBox.about(self, "About PdfViewer",
+ "An example using QPdfDocument")
+
+ @Slot()
+ def on_actionAbout_Qt_triggered(self):
+ QMessageBox.aboutQt(self)
+
+ @Slot()
+ def on_actionZoom_In_triggered(self):
+ factor = self.ui.pdfView.zoomFactor() * ZOOM_MULTIPLIER
+ self.ui.pdfView.setZoomFactor(factor)
+
+ @Slot()
+ def on_actionZoom_Out_triggered(self):
+ factor = self.ui.pdfView.zoomFactor() / ZOOM_MULTIPLIER
+ self.ui.pdfView.setZoomFactor(factor)
+
+ @Slot()
+ def on_actionPrevious_Page_triggered(self):
+ nav = self.ui.pdfView.pageNavigator()
+ nav.jump(nav.currentPage() - 1, QPoint(), nav.currentZoom())
+
+ @Slot()
+ def on_actionNext_Page_triggered(self):
+ nav = self.ui.pdfView.pageNavigator()
+ nav.jump(nav.currentPage() + 1, QPoint(), nav.currentZoom())
+
+ @Slot()
+ def on_actionContinuous_triggered(self):
+ cont_checked = self.ui.actionContinuous.isChecked()
+ mode = QPdfView.PageMode.MultiPage if cont_checked else QPdfView.PageMode.SinglePage
+ self.ui.pdfView.setPageMode(mode)
+
+ @Slot()
+ def on_actionBack_triggered(self):
+ self.ui.pdfView.pageNavigator().back()
+
+ @Slot()
+ def on_actionForward_triggered(self):
+ self.ui.pdfView.pageNavigator().forward()