QT 5.9 实现 QWebEngineView 打印html内容

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

你可能感兴趣的:(c/c++,QT)