WebEngine Widgets PrintMe Ejemplo
Demuestra cómo imprimir páginas web utilizando los widgets Qt WebEngine.

PrintMe demuestra cómo utilizar las clases QWebEnginePage y QPrintDialog para imprimir una página web. Además, muestra cómo implementar la vista previa de impresión utilizando la clase QPrintPreviewDialog. Para completar, también ilustra cómo lanzar una petición de impresión dentro de JavaScript.
Ejecución del ejemplo
Para ejecutar el ejemplo desde Qt Creatorabra el modo Welcome y seleccione el ejemplo de Examples. Para más información, consulte Qt Creator: Tutorial: Construir y ejecutar.
Página HTML simple
En este ejemplo, creamos una página HTML interna que se añade como un archivo de colección de recursos (.qrc). La página sólo muestra un pequeño cuadro de mensaje HTML que explica cómo activar la impresión mediante atajos de teclado o haciendo clic en un botón. El botón tiene el atributo de evento JavaScript onclick que llama a la función JavaScript window.print().
<html lang="en">
<head>
<meta charset="utf-8">
<title>PrintMe</title>
<link rel="stylesheet" type="text/css" href="style.css">
<script>
function printNow() {
window.print();
}
</script>
</head>
<body>
<form class="form">
<div class="header">
<h1>Hello Paper World!</h1>
<h2>Press Ctrl+p to print with print preview</h2>
<h2>Press Ctrl+Shift+p to print without print preview</h2>
<h2>Click the button to print using JavaScript</h2>
<p class="button" onclick="printNow()">Print Now</p>
</div>
</form>
</body>
</html>Función principal
En la función main, primero instanciamos un QWebEngineView y establecemos la URL de nuestra página HTML interna. A continuación, creamos una instancia de PrintHandler y le pasamos la página solicitada. Para mayor comodidad, también creamos atajos de teclado que se pueden utilizar para llamar a un diálogo de impresión o a un diálogo de vista previa de impresión.
QWebEngineView view; view.setUrl(QUrl(QStringLiteral("qrc:/index.html"))); view.resize(1024, 750); view.show(); PrintHandler handler; handler.setView(&view); 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);
Manejador de impresión
En la clase PrintHandler, primero implementamos printPreview(), donde instanciamos QPrintPreviewDialog. Necesitamos el manejador QPrintPreviewDialog::paintRequested para generar un conjunto de páginas de vista previa.
void PrintHandler::printPreview() { if (!m_view) return; if (m_inPrintPreview) return; m_inPrintPreview = true; QPrintPreviewDialog preview(&m_printer, m_view); connect(&preview, &QPrintPreviewDialog::paintRequested, this, &PrintHandler::printDocument); preview.exec(); m_inPrintPreview = false; }
Ahora podemos implementar la ranura PrintHandler::printDocument(), que es llamada en respuesta a la señal QPrintPreviewDialog::paintRequested. Para pintar realmente en una impresora, llamamos a la función QWebEngineView::print(). La impresión es una operación asíncrona en Chromium, pero no en Qt, por lo que ejecutamos un bucle de eventos local utilizando QEventLoop::exec() para asegurarnos de que la impresión se realiza antes de volver. La entrada del usuario está bloqueada, ya que hacer clic en un botón mientras esperamos a que termine la impresión puede desordenar el estado interno y provocar un fallo.
void PrintHandler::printDocument(QPrinter *printer) { m_view->print(printer); // User input in the print preview dialog while we're waiting on a print task // can mess up the internal state and cause a crash. m_waitForResult.exec(QEventLoop::ExcludeUserInputEvents); }
Para ser notificados sobre el resultado del trabajo de impresión, implementamos la ranura PrintHandler::printFinished() como manejador de la señal QWebEngineView::printFinished(). Comprobamos success e informamos de cualquier error que se haya producido. Finalmente, llamamos a QEventLoop::quit() para salir del bucle local de eventos.
void PrintHandler::printFinished(bool success) { if (!success) { QPainter painter; if (painter.begin(&m_printer)) { QFont font = painter.font(); font.setPixelSize(20); painter.setFont(font); painter.drawText(QPointF(10,25), QStringLiteral("Could not generate print preview.")); painter.end(); } } m_waitForResult.quit(); }
La última función que implementamos, PrintHandler::print(), es trivial, porque simplemente abre QPrintDialog y llama a la previamente implementada PrintHandler::printDocument().
void PrintHandler::print() { QPrintDialog dialog(&m_printer, m_view); if (dialog.exec() != QDialog::Accepted) return; printDocument(&m_printer); }
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.