Sur cette page

Widgets WebEngine Exemple PrintMe

Démontre comment imprimer des pages web en utilisant les Qt Widgets WebEngine.

Fenêtre avec bouton d'impression et raccourcis pour l'aperçu avant impression, l'impression directe et les options d'impression JavaScript

PrintMe montre comment utiliser les classes QWebEnginePage et QPrintDialog pour imprimer une page web. En outre, il montre comment mettre en œuvre l'aperçu avant impression en utilisant la classe QPrintPreviewDialog. Pour être complet, il illustre également comment déclencher une demande d'impression en JavaScript.

Exécution de l'exemple

Pour exécuter l'exemple à partir de Qt Creatorouvrez le mode Welcome et sélectionnez l'exemple à partir de Examples. Pour plus d'informations, voir Qt Creator: Tutoriel : Construire et exécuter.

Page HTML simple

Dans cet exemple, nous créons une page HTML interne qui est ajoutée en tant que fichier de collecte de ressources (.qrc). La page n'affiche qu'une petite boîte de message HTML qui explique comment déclencher l'impression en utilisant des raccourcis clavier ou en cliquant sur un bouton. Le bouton possède l'attribut d'événement JavaScript onclick qui appelle la fonction 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>

Fonction principale

Dans la fonction main, nous commençons par instancier un QWebEngineView et définissons l'URL de notre page HTML interne. Ensuite, nous créons une instance PrintHandler et lui transmettons la page demandée. Pour plus de commodité, nous créons également des raccourcis clavier qui peuvent être utilisés pour appeler une boîte de dialogue d'impression ou une boîte de dialogue d'aperçu avant impression.

    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);

Dans la classe PrintHandler, nous implémentons d'abord printPreview(), où nous instancions QPrintPreviewDialog. Nous avons besoin du gestionnaire QPrintPreviewDialog::paintRequested pour générer un ensemble de pages de prévisualisation.

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;
}

Nous pouvons maintenant implémenter le slot PrintHandler::printDocument(), qui est appelé en réponse au signal QPrintPreviewDialog::paintRequested. Pour peindre sur une imprimante, nous appelons la fonction QWebEngineView::print(). L'impression est une opération asynchrone dans Chromium, mais pas dans Qt XML, nous exécutons donc une boucle événementielle locale en utilisant QEventLoop::exec() pour nous assurer que l'impression est terminée avant de revenir. L'entrée de l'utilisateur est bloquée, car le fait de cliquer sur un bouton pendant que nous attendons la fin de l'impression peut perturber l'état interne et provoquer un plantage.

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);
}

Pour être informé du résultat du travail d'impression, nous implémentons le slot PrintHandler::printFinished() en tant que gestionnaire du signal QWebEngineView::printFinished(). Nous vérifions la présence de success et signalons toute erreur survenue. Enfin, nous appelons QEventLoop::quit() pour sortir de la boucle d'événements locaux.

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 dernière fonction que nous implémentons, PrintHandler::print(), est triviale, car elle ouvre simplement QPrintDialog et appelle la fonction précédemment implémentée PrintHandler::printDocument().

void PrintHandler::print()
{
    QPrintDialog dialog(&m_printer, m_view);
    if (dialog.exec() != QDialog::Accepted)
        return;
    printDocument(&m_printer);
}

Exemple de projet @ code.qt.io

© 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.