gpt4 book ai didi

javascript - QtWebEngine:打印由javascript调用的网页

转载 作者:行者123 更新时间:2023-12-02 15:32:13 24 4
gpt4 key购买 nike

来自here ,我知道我可以使用 QWebEngineView::render,传递指向 QPrinter 对象的指针,以编程方式打印网页。

但是,如果打印请求是由 javascript 调用的(例如,从 window.print() javascript 函数),我不知道如何捕获该请求,然后将其交给我的打印功能。

最佳答案

两年后我终于想出了解决这个问题的方法。

Qt 5.8 确实支持打印,但是选择完全忽略 javascript 调用的 window.print() 请求。

解决方案是注入(inject)一些 JavaScript 来覆盖 window.print() 函数:

class JavascriptInvokedPrintComm : public QWebChannel
{
Q_OBJECT
public:
JavascriptInvokedPrintComm(QObject *parent) : QWebChannel(parent)
{
registerObject("webEngineViewBridge", this);
}

public slots:
void print()
{
emit printRequest();
}

signals:
void printRequest();
};

class MyWebEngineView : public QWebEngineView
{
Q_OBJECT
public:
MyWebEngineView(QWdidget *parent) : QWebEngineView(parent)
{
// Inject qwebchannel.js so that we can handle javascript invoked printing
QWebEngineScript webChannelJs;
webChannelJs.setInjectionPoint(QWebEngineScript::DocumentCreation);
webChannelJs.setWorldId(QWebEngineScript::MainWorld);
webChannelJs.setName("qwebchannel.js");
webChannelJs.setRunsOnSubFrames(true);
{
QFile webChannelJsFile(":/qtwebchannel/qwebchannel.js");
webChannelJsFile.open(QFile::ReadOnly);
webChannelJs.setSourceCode(webChannelJsFile.readAll());
}
page()->scripts().insert(webChannelJs);

// Inject some javascript to override the window.print() function so that we can actually catch and handle
// javascript invoked print requests
QWebEngineScript overrideJsPrint;
overrideJsPrint.setInjectionPoint(QWebEngineScript::DocumentCreation);
overrideJsPrint.setWorldId(QWebEngineScript::MainWorld);
overrideJsPrint.setName("overridejsprint.js");
overrideJsPrint.setRunsOnSubFrames(true);
overrideJsPrint.setSourceCode(
"window.print = function() { "
" new QWebChannel(qt.webChannelTransport, function(channel) { "
" var webEngineViewBridge = channel.objects.webEngineViewBridge; "
" webEngineViewBridge.print(); "
" });"
"};"
);
page()->scripts().insert(overrideJsPrint);

JavascriptInvokedPrintComm *jsInvokedPrintComm = new JavascriptInvokedPrintComm(this);
connect(jsInvokedPrintComm, &JavascriptInvokedPrintComm::printRequest, [this]()
{
QPrintDialog *prntDlg = new QPrintDialog(this);
if(!prntDlg->exec())
{
prntDlg->deleteLater();
return;
}

page()->print(prntDlg->printer(),
[prntDlg](bool ok)
{
Q_UNUSED(ok);
prntDlg->deleteLater();
}
);
});
}
}

*未经过编译测试,但概念上这应该可行

关于javascript - QtWebEngine:打印由javascript调用的网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33217930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com