英文引用网址:https://www3.sra.co.jp/qt/relation/doc/qtwebengine/qtwebengine-webenginewidgets-printme-example.html
做个纪录,以便以后参考:
In themainfunction, we first instantiate aQWebEngineViewand set the URL to our internal HTML page. Next, we create aPrintHandlerinstance and pass the requested page. For convenience, we also create keyboard shortcuts that can be used to call a print dialog or print preview dialog.
QWebEngineView view;
view.setUrl(QUrl(QStringLiteral("qrc:/index.html")));
view.resize(1024, 750);
view.show();
PrintHandler handler;
handler.setPage(view.page());
auto printPreviewShortCut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_P), &view);
auto printShortCut = new QShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_P), &view);
QObject::connect(printPreviewShortCut, &QShortcut::activated, &handler, &PrintHandler::printPreview);
QObject::connect(printShortCut, &QShortcut::activated, &handler, &PrintHandler::print);
Print Handler
In thePrintHandlerfunction, we first implementprintPreview(), where we instantiateQPrintertogether withQPrintPreviewDialog. We need theQPrintPreviewDialog::paintRequestedhandle to generate a set of preview pages.
void PrintHandler::printPreview()
{
if (!m_page)
return;
if (m_inPrintPreview)
return;
m_inPrintPreview = true;
QPrinter printer;
QPrintPreviewDialog preview(&printer, m_page->view());
connect(&preview, &QPrintPreviewDialog::paintRequested,
this, &PrintHandler::printDocument);
preview.exec();
m_inPrintPreview = false;
}
Now we can implement thePrintHandler::printDocument()slot, which is called in response to theQPrintPreviewDialog::paintRequestedsignal.
void PrintHandler::printDocument(QPrinter *printer)
{
QEventLoop loop;
bool result;
auto printPreview = [&](bool success) { result = success; loop.quit(); };
m_page->print(printer, std::move(printPreview));
loop.exec();
if (!result) {
QPainter painter;
if (painter.begin(printer)) {
QFont font = painter.font();
font.setPixelSize(20);
painter.setFont(font);
painter.drawText(QPointF(10,25),
QStringLiteral("Could not generate print preview."));
painter.end();
}
}
}
To do actual painting on a printer, we call theQWebEnginePage::print() function. Because this call blocks the main event loop, we need to create a local one. We begin the local event loop by callingQEventLoop::exec(). When the local event loop terminates, we check forresultand report any errors that occurred.
The last function we implement,PrintHandler::print(), is trivial, because it simply opensQPrintDialogand calls the previously implementedPrintHandler::printDocument().
void PrintHandler::print()
{
QPrinter printer(QPrinter::HighResolution);
QPrintDialog dialog(&printer, m_page->view());
if (dialog.exec() != QDialog::Accepted)
return;
printDocument(&printer);
}