功能说明
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,QColor
class 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 = False
self.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 = True
self.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 = False
self.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("页面导航器为空")
return
self.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())