pyside6 的pdf显示测试 -- 01

发布于:2025-09-10 ⋅ 阅读:(14) ⋅ 点赞:(0)

功能说明

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

测试结果

小结


网站公告

今日签到

点亮在社区的每一天
去签到