PyQt5桌面应用集成ERPNext时打印/预览功能失效问题
PyQt5桌面应用集成ERPNext时打印/预览功能失效问题
我之前在做PyQt嵌入Web应用时也碰到过类似的打印功能卡壳情况,结合ERPNext(基于Frappe框架)的特性,给你梳理几个大概率的原因和对应的解决办法:
1. 未处理ERPNext的新窗口请求
ERPNext的打印预览功能通常会新开一个浏览器窗口加载PDF预览页面,但PyQt的QWebEngineView默认不会自动处理新窗口的创建请求,这就导致点击打印预览后没反应。
解决办法是自定义QWebEnginePage类,重写createWindow方法来响应新窗口请求:
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage from PyQt5.QtWidgets import QMainWindow, QApplication from PyQt5.QtCore import Qt, QUrl class CustomWebEnginePage(QWebEnginePage): def createWindow(self, _type): # 创建新的WebView来承载打印预览窗口 new_view = QWebEngineView() new_view.setAttribute(Qt.WA_DeleteOnClose) # 关闭时自动释放资源 new_view.show() return new_view.page() class ERPNextEmbedWindow(QMainWindow): def __init__(self): super().__init__() self.browser = QWebEngineView() # 给浏览器设置自定义的Page对象 self.browser.setPage(CustomWebEnginePage(self.browser)) # 替换成你的ERPNext实例地址 self.browser.load(QUrl("https://your-erpnext-domain.com")) self.setCentralWidget(self.browser) self.show() if __name__ == "__main__": app = QApplication([]) window = ERPNextEmbedWindow() app.exec_()
2. 未启用PyQt WebEngine的PDF查看支持
ERPNext的预览依赖浏览器的PDF渲染能力,PyQt的WebEngine可能默认没开启PDF查看器,导致预览页面无法加载。
可以在初始化QApplication时添加启用PDF的参数:
app = QApplication(["--enable-pdf-viewer"])
注意要确保你的PyQt5版本在5.10以上,这个版本之后WebEngine才内置了PDF查看器。
3. JavaScript权限限制导致打印触发失败
ERPNext的打印功能是通过JavaScript触发的,如果PyQt的WebEngine禁用了JS或弹窗权限,也会导致功能失效。
可以手动开启相关权限:
page = self.browser.page() settings = page.settings() # 启用JavaScript settings.setAttribute(settings.JavascriptEnabled, True) # 允许JS打开新窗口 settings.setAttribute(settings.JavascriptCanOpenWindows, True) # 允许JS访问打印相关API settings.setAttribute(settings.JavascriptCanAccessClipboard, True)
另外,你也可以直接监听打印请求信号,手动触发系统打印对话框:
from PyQt5.QtPrintSupport import QPrintDialog # 在窗口初始化时连接信号 self.browser.page().printRequested.connect(self.handle_print) def handle_print(self): printer = QPrinter() dialog = QPrintDialog(printer, self) if dialog.exec_() == QPrintDialog.Accepted: self.browser.page().print(printer)
4. 排查JS错误
如果上面的方法都没解决,可以监听WebEngine的控制台日志,看看ERPNext的JS代码在PyQt环境里有没有报错:
self.browser.page().consoleMessage.connect( lambda level, msg, line, source: print(f"[JS日志] 行{line}: {msg}") )
运行后点击打印按钮,查看控制台输出的错误信息,就能定位具体的问题点了。
备注:内容来源于stack exchange,提问作者Saurav Kumar
相关产品推荐
相关产品推荐

