英文引用网址: https://www3.sra.co.jp/qt/relation/doc/qtwebengine/qtwebengine-webenginewidgets-printme-example.html
做个纪录,以便以后参考:
In the main
function, we first instantiate a QWebEngineView and set the URL to our internal HTML page. Next, we create a PrintHandler
instance 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 the PrintHandler
function, we first implement printPreview()
, where we instantiate QPrinter together with QPrintPreviewDialog. We need the QPrintPreviewDialog::paintRequested handle 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 the PrintHandler::printDocument()
slot, which is called in response to the QPrintPreviewDialog::paintRequested signal.
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 the QWebEnginePage::print() function. Because this call blocks the main event loop, we need to create a local one. We begin the local event loop by calling QEventLoop::exec(). When the local event loop terminates, we check for result
and report any errors that occurred.
The last function we implement, PrintHandler::print()
, is trivial, because it simply opens QPrintDialog and calls the previously implemented PrintHandler::printDocument()
.
void PrintHandler::print() { QPrinter printer(QPrinter::HighResolution); QPrintDialog dialog(&printer, m_page->view()); if (dialog.exec() != QDialog::Accepted) return; printDocument(&printer); }