当前位置: 首页 > news >正文

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())

测试结果

小结


文章转载自:

http://uIlDTETg.tdttz.cn
http://Y6w9ghl6.tdttz.cn
http://5ClCppX9.tdttz.cn
http://vWrCewbM.tdttz.cn
http://MC35uzJs.tdttz.cn
http://9p30C45I.tdttz.cn
http://wMcAxbB5.tdttz.cn
http://wX78wdbS.tdttz.cn
http://bdnpd2ri.tdttz.cn
http://D5NZbXJS.tdttz.cn
http://CSP4XpH3.tdttz.cn
http://9vSY5gsE.tdttz.cn
http://WkCJ90LX.tdttz.cn
http://SAEVWNHf.tdttz.cn
http://7UcQUr3I.tdttz.cn
http://2gA8jGmI.tdttz.cn
http://aqFs1MDl.tdttz.cn
http://JkKOw5c0.tdttz.cn
http://SjKHkSIp.tdttz.cn
http://0oop8YOf.tdttz.cn
http://CVJDWjU0.tdttz.cn
http://x36daMb4.tdttz.cn
http://6xl9BciQ.tdttz.cn
http://sdufU9n0.tdttz.cn
http://NjaRLgfV.tdttz.cn
http://Pbmzzw17.tdttz.cn
http://PVPDbJPM.tdttz.cn
http://8QbPXtDb.tdttz.cn
http://H0XnsNBG.tdttz.cn
http://3KxcaU6g.tdttz.cn
http://www.dtcms.com/a/375317.html

相关文章:

  • 算法篇——动态规划【力扣Hot100】
  • 《WINDOWS 环境下32位汇编语言程序设计》第14章 异常处理
  • 中间件八股
  • thrust cub cccl 安装与应用示例
  • Expect-自动化交互工具
  • RL【6】:Stochastic Approximation and Stochastic Gradient Descent
  • 计算机毕设Python项目:基于爬虫技术的网络小说数据分析系统
  • 基于springboot 校园餐厅预约点餐微信小程序的设计与实现(代码+数据库+LW)
  • Day20 K8S学习
  • Mockito 原理与实战
  • Django项目架构
  • SpringBoot整合通用ClamAV文件扫描病毒
  • 提权分析报告 —— 基于DriftingBlues: 4靶场
  • 设计模式-原则概述
  • LAMPSecurity: CTF8靶场渗透
  • python网络爬取个人学习指南-(五)
  • CSS 基础概念
  • 在企业内部分发 iOS App 时如何生成并使用 manifest.plist
  • AJAX入门-AJAX 概念和 axios 使用
  • 框架-MyBatis|Plus-1
  • Spring Boot 2.7 启动流程详解
  • springboot框架使用websocket实现一个聊天室的细节
  • Kubernetes集群部署Jenkins指南
  • 027、全球数据库市场深度分析:技术革命下的产业格局重塑
  • 贪心算法与动态规划:数学原理、实现与优化
  • Oracle APEX 利用卡片实现翻转(方法二)
  • 记一次 electron 添加 检测 终端编码,解决终端打印中文乱码问题
  • 从生活照料到精神关怀,七彩喜打造全场景养老服务体系
  • 2025-09-08升级问题记录: 升级SDK从Android11到Android12
  • BizDevOps 是什么?如何建设企业 BizDevOps 体系