pyside6 的pdf显示测试 -- 01
功能说明
1 实现上一页、下一页导航QPdfPageNavigator实现,并更新页码
2 实现单页和全部页显示,在全屏显示时,更新页码
3 实现全屏和Esc键退出全屏显示
测试代码
import sys
from PySide6.QtWidgets import (QApplication, QMainWindow,QMenuBar,QMenu,QToolBar,QStatusBar,QWidget,QVBoxLayout,QHBoxLayout,QPushButton,QLabel)
from PySide6.QtPdfWidgets import QPdfView,QPdfPageSelector
from PySide6.QtPdf import QPdfDocument,QPdfPageNavigator
from PySide6.QtCore import QPointF, Signal,QStringListModel,QMetaObject, QObject, QTimer, Qt, Slot,QThread
from PySide6.QtGui import QIcon,QPixmap,QPainter,QPen,QBrush,QColorclass PDFViewer(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("PySide6 PDF 查看器")self.initUI()self.loadPdf()self.resize(800, 600)def initUI(self):self.center_window = QWidget()self.vbox = QVBoxLayout()self.hbox = QHBoxLayout()self.pre_button = QPushButton("上一页")self.next_button = QPushButton("下一页")self.label = QLabel("当前页数: 0/0")self.page_selector = QPdfPageSelector()self.single_page_btn = QPushButton("单页")self.multi_page_btn = QPushButton("多页")self.full_screen_btn = QPushButton("全屏")self.hbox.addWidget(self.pre_button)self.hbox.addWidget(self.next_button)#self.hbox.addWidget(self.page_selector)self.hbox.addWidget(self.label)self.hbox.addWidget(self.single_page_btn)self.hbox.addWidget(self.multi_page_btn)self.hbox.addWidget(self.full_screen_btn)self.hbox.addStretch(1)self.vbox.addLayout(self.hbox)# 创建 PDF 查看器self.pdf_view = QPdfView()self.vbox.addWidget(self.pdf_view)self.center_window.setLayout(self.vbox)self.setCentralWidget(self.center_window)self.pre_button.clicked.connect(lambda: self.goToPreviousPage())self.next_button.clicked.connect(lambda: self.goToNextPage())self.single_page_btn.clicked.connect(lambda: self.pdf_view.setPageMode(QPdfView.PageMode.SinglePage))self.multi_page_btn.clicked.connect(lambda: self.pdf_view.setPageMode(QPdfView.MultiPage))self.is_fullscreen = Falseself.full_screen_btn.clicked.connect(lambda: self.toggleFullScreen())def closeEvent(self, event):self.pdf_document.deleteLater()super().closeEvent(event)def showFullScreen(self):self.pdf_view.showMaximized()#self.showMaximized()def toggleFullScreen(self):if not self.is_fullscreen:# 进入全屏模式self.enterFullScreen()else:# 退出全屏模式self.exitFullScreen()def enterFullScreen(self):# 保存原始状态self.original_geometry = self.saveGeometry()self.original_visible = {"menu_bar": self.menuBar().isVisible(),"tool_bar": self.toolBar().isVisible() if hasattr(self, 'toolBar') else False,"status_bar": self.statusBar().isVisible()}# 隐藏所有界面元素self.menuBar().hide()#self.toolBar().hide()self.statusBar().hide()self.hbox.setContentsMargins(0, 0, 0, 0)# 保存当前控件可见性for widget in [self.pre_button, self.next_button, self.label, self.single_page_btn, self.multi_page_btn, self.full_screen_btn]:self.original_visible[widget.objectName()] = widget.isVisible()widget.hide()self.setWindowState(Qt.WindowFullScreen)self.pdf_view.setWindowState(Qt.WindowFullScreen)self.pdf_view.setVisible(True)# 进入全屏self.showFullScreen()self.is_fullscreen = Trueself.pdf_view.setFocus() # 确保键盘事件能被正确捕获def exitFullScreen(self):# 恢复原始窗口状态if self.original_geometry:self.restoreGeometry(self.original_geometry)# 恢复界面元素self.menuBar().setVisible(self.original_visible["menu_bar"])self.statusBar().setVisible(self.original_visible["status_bar"])# 恢复工具栏(如果有)if hasattr(self, 'toolBar'):self.toolBar().setVisible(self.original_visible["tool_bar"])# 恢复控件可见性for widget in [self.pre_button, self.next_button, self.label, self.single_page_btn, self.multi_page_btn, self.full_screen_btn]:widget.setVisible(self.original_visible.get(widget.objectName(), True))self.is_fullscreen = Falseself.showNormal()def keyPressEvent(self, event):# 捕获Esc按键if event.key() == Qt.Key_Escape and self.is_fullscreen:self.toggleFullScreen()event.accept() # 阻止事件继续传播else:super().keyPressEvent(event)def loadPdf(self):# 创建 PDF 文档对象self.pdf_document = QPdfDocument() self.pdf_document.pageCountChanged.connect(lambda index:{print(f"总页数: {self.pdf_document.pageCount()}")})# 加载 PDF 文档(替换为你的 PDF 文件路径)pdf_path = "modbus rtu临时配置工具使用说明v1.0.0.3.pdf" # 请替换为实际的 PDF 文件路径if not self.pdf_document.load(pdf_path):print(f"无法加载 PDF 文件: {pdf_path}")print(f"错误信息: {self.pdf_document.errorString()}")sys.exit(1)# 设置 PDF 文档到查看器self.pdf_view.setDocument(self.pdf_document)self.label.setText(f"当前页数: {self.pdf_view.pageNavigator().currentPage() + 1}/{self.pdf_document.pageCount()}")self.pdf_view.pageNavigator().currentPageChanged.connect(lambda index:{print(f"当前页号: {self.pdf_view.pageNavigator().currentPage()}"),self.updatePageNumber()})self.page_selector.setDocument(self.pdf_document)def updatePageNumber(self):if self.pdf_view.pageNavigator() is None:print("页面导航器为空")returnself.label.setText(f"当前页数: {self.pdf_view.pageNavigator().currentPage() + 1}/{self.pdf_document.pageCount()}")def goToPreviousPage(self):navi = self.pdf_view.pageNavigator()page = navi.currentPage()if page > 0:navi.jump(page - 1,QPointF(0,0))self.next_button.setEnabled(True)else:print("已经是第一页了")self.pre_button.setEnabled(False)self.updatePageNumber()def goToNextPage(self): navi = self.pdf_view.pageNavigator()page = navi.currentPage()if page < self.pdf_document.pageCount() - 1: navi.jump(page + 1,QPointF(0,0))self.pre_button.setEnabled(True)else:print("已经是最后一页了")self.next_button.setEnabled(False)self.updatePageNumber()if __name__ == "__main__":app = QApplication(sys.argv)viewer = PDFViewer()viewer.show()sys.exit(app.exec())