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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:58:05