Ну, я пытаюсь напечатать QWebView с несколькими страницами, используя атрибут разрыва страницы CSS, который отлично работает с WebKit.
Я использую Qt 5.1.1.
Моя главная проблема в том, что все в порядке, когда я печатаю его в формате PDF с использованием Qt, но когда я пытаюсь распечатать его на реальном принтере, все страницы, кроме первой, остаются пустыми!
Вот мой (раздетый) код теста:
Test.h:
class MainWindow : public QMainWindow, private Ui::MainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
public slots:
void printHTML();
void printPreview(QPrinter *printer);
private:
QWebView webView;
};
Test.cpp:
#include "Test.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
QString html;
html= "<!DOCTYPE html><html> <head> <meta http-equiv='content-type' content='text/html;charset=UTF-8' /> <title>Paginated HTML</title> <style type='text/css' media='print'> div.page { page-break-after: always; page-break-inside: avoid; } </style> </head> <body> <div class='page'> <h1>This is Page 1</h1> </div> <div class='page'> <h1>This is Page 2</h1> </div> <div class='page'> <h1>This is Page 3</h1> </div> </body></html>";
webView.setHtml(html);
printHTML();
}
void MainWindow::printPreview(QPrinter *printer)
{
webView.print(printer);
}
void MainWindow::printHTML()
{
QPrinter printer;
QPrintPreviewDialog preview(&printer);
preview.setWindowTitle("Test imp");
connect(&preview, SIGNAL(paintRequested(QPrinter*)), this, SLOT(printPreview(QPrinter*)));
preview.exec();
this->close();
}
Я вставил пример HTML в виде строки, этот пример отлично работает с любым другим движком WebKit и хорошо печатает.
Предварительный просмотр отобразит его так, как он должен быть напечатан, и когда вы на самом деле напечатаете его с помощью кнопки печати предварительного просмотра, он напечатает первую страницу без каких-либо проблем, но тогда все оставшиеся страницы будут полностью пустыми, пустыми.
Я не смог найти никакого обходного пути, использование QPainter для его рендеринга исключено, так как мне нужно иметь несколько страниц, а QPainter не совсем хороший способ управления несколькими страницами (по крайней мере, я не знать, как, если это возможно: я никогда не видел, чтобы QPainter управлял несколькими страницами после рендеринга.)
PS: попробуйте сами, добавив
printer.setOutputFormat(QPrinter::PdfFormat);
сразу после того, как объявление QPrinter работает нормально, оно сохраняется в формате PDF и отображается с каждой распечатанной страницей.
Что является проблемой, так как мне нужно печатать на обычном принтере, и я хотел бы избежать сохранения в формате PDF, а затем распечатывать PDF.
Это никогда не исправлялось в Qt, но теперь QWebView заменен на QWebEngine, и он не страдает от этих проблем при печати своих страниц.
Других решений пока нет …