You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maya 2020中使用PySide2窗口显示PDF的问题求助

在Maya 2020中实现内嵌PDF阅读器的解决方案

因为Maya 2020绑定的PySide2对应Qt版本低于5.13,确实没有PdfViewerEnabled这个WebEngine属性,内置PDF渲染路径走不通,下面给几个适配Maya环境的可行方案:

方案1:使用PyMuPDF(fitz)渲染PDF(跨平台推荐)

PyMuPDF是轻量高效的PDF处理库,不依赖高版本Qt,可直接将PDF页面渲染到Qt控件上,适配Maya环境。

操作步骤:

  1. 先在Maya的Python环境安装PyMuPDF:打开Maya脚本编辑器,运行以下代码
import subprocess
import sys
subprocess.check_call([sys.executable, "-m", "pip", "install", "pymupdf"])
  1. 完整实现代码:
from PySide2 import QtWidgets, QtCore, QtGui
import fitz
import maya.OpenMayaUI as omui
from shiboken2 import wrapInstance

def get_maya_main_window():
    ptr = omui.MQtUtil.mainWindow()
    return wrapInstance(int(ptr), QtWidgets.QWidget)

class PDFViewer(QtWidgets.QMainWindow):
    def __init__(self, pdf_path, parent=None):
        super().__init__(parent=parent)
        self.setWindowTitle("Maya PDF Viewer")
        self.setGeometry(100, 100, 800, 600)
        
        self.pdf_path = pdf_path
        self.doc = fitz.open(pdf_path)
        self.current_page = 0
        
        # 分页工具栏
        toolbar = QtWidgets.QToolBar()
        self.addToolBar(toolbar)
        
        self.prev_btn = QtWidgets.QPushButton("上一页")
        self.next_btn = QtWidgets.QPushButton("下一页")
        self.page_label = QtWidgets.QLabel(f"第 {self.current_page+1}/{len(self.doc)} 页")
        
        toolbar.addWidget(self.prev_btn)
        toolbar.addWidget(self.next_btn)
        toolbar.addWidget(self.page_label)
        
        # PDF显示区域
        self.image_label = QtWidgets.QLabel()
        self.image_label.setAlignment(QtCore.Qt.AlignCenter)
        scroll_area = QtWidgets.QScrollArea()
        scroll_area.setWidget(self.image_label)
        self.setCentralWidget(scroll_area)
        
        # 绑定分页按钮信号
        self.prev_btn.clicked.connect(self.go_prev_page)
        self.next_btn.clicked.connect(self.go_next_page)
        
        # 加载初始页面
        self.render_page(self.current_page)
        
    def render_page(self, page_num):
        if 0 <= page_num < len(self.doc):
            page = self.doc.load_page(page_num)
            pix = page.get_pixmap()
            # 转换为Qt兼容图像格式
            qimg = QtGui.QImage(pix.samples, pix.width, pix.height, pix.stride, QtGui.QImage.Format_RGB888)
            self.image_label.setPixmap(QtGui.QPixmap.fromImage(qimg))
            self.current_page = page_num
            self.page_label.setText(f"第 {self.current_page+1}/{len(self.doc)} 页")
            
    def go_prev_page(self):
        self.render_page(self.current_page - 1)
        
    def go_next_page(self):
        self.render_page(self.current_page + 1)

# Maya中运行示例
if __name__ == "__main__":
    # 替换为你的PDF文件路径
    pdf_path = r"C:/Users/test/test/Document.pdf"
    # 绑定Maya主窗口作为父容器,避免独立窗口导致的稳定性问题
    viewer = PDFViewer(pdf_path, parent=get_maya_main_window())
    viewer.show()

方案2:Windows下使用QAxWidget嵌入系统PDF控件(仅Windows)

如果是Windows环境,可利用QAxWidget调用系统自带的PDF阅读器控件(如Adobe Reader的AcroPDF控件),直接内嵌到Maya窗口。

代码示例:

from PySide2 import QtWidgets, QtCore
import maya.OpenMayaUI as omui
from shiboken2 import wrapInstance

def get_maya_main_window():
    ptr = omui.MQtUtil.mainWindow()
    return wrapInstance(int(ptr), QtWidgets.QWidget)

class PDFViewer(QtWidgets.QMainWindow):
    def __init__(self, pdf_path, parent=None):
        super().__init__(parent=parent)
        self.setWindowTitle("Maya PDF Viewer")
        self.setGeometry(100, 100, 800, 600)
        
        # 创建ActiveX控件实例
        self.ax_widget = QtWidgets.QAxWidget("AcroPDF.PDF", self)
        self.setCentralWidget(self.ax_widget)
        
        # 加载指定PDF文件
        self.ax_widget.dynamicCall("LoadFile(const QString&)", pdf_path)

# Maya中运行示例
if __name__ == "__main__":
    pdf_path = r"C:/Users/test/test/Document.pdf"
    viewer = PDFViewer(pdf_path, parent=get_maya_main_window())
    viewer.show()

注意:此方案需要系统预先安装Adobe Reader或其他支持AcroPDF控件的PDF软件。

不推荐方案:升级Maya的PySide2

虽然可以尝试将Maya自带的PySide2升级到更高版本,但可能与Maya内部Qt依赖产生冲突,导致软件崩溃或功能异常,除非你能承担稳定性风险,否则不建议操作。

内容的提问来源于stack exchange,提问作者Vlad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:43:12