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环境。
操作步骤:
- 先在Maya的Python环境安装PyMuPDF:打开Maya脚本编辑器,运行以下代码
import subprocess import sys subprocess.check_call([sys.executable, "-m", "pip", "install", "pymupdf"])
- 完整实现代码:
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
相关产品推荐
相关产品推荐

