900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > qt打印预览html QT 5.9 实现 QWebEngineView 打印html内容

qt打印预览html QT 5.9 实现 QWebEngineView 打印html内容

时间:2022-12-17 15:30:06

相关推荐

qt打印预览html QT 5.9 实现 QWebEngineView 打印html内容

英文引用网址: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);

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。