【问题标题】:QwebEnginePage Doesn't print html code QtQwebEnginePage 不打印 html 代码 Qt
【发布时间】:2020-03-27 21:07:51
【问题描述】:

我尝试使用 qwebenginepage 打印 Html 但没有工作我搜索了很多来解决这个问题但没有找到答案。

我使用的是 QTextBrowser 但是当打印时它改变了页面的样式所以我尝试使用 qwebenginepage

QWebEnginePage *view = new QWebEnginePage;
QFile file("/home/hackerpoint/Desktop/some.html");
if(file.open(QIODevice::Text | QIODevice::ReadOnly)){
    QString html = file.readAll();
    QPrinter print(QPrinter::HighResolution);
    print.setPageSize(QPrinter::A4);
    print.setFullPage(true);
    print.setOutputFormat(QPrinter::PdfFormat);
    print.setOutputFileName("somefile.pdf");
    view->setHtml(html);
    if(&QWebEnginePage::loadFinished){
        view->print(&print , [=](bool){});
    }
    else {
        qInfo() << "Html Not loaded";
    }
}

这是错误

1  QPrinter::toPage() const                                                                      
2 QtWebEngineCore::PrinterWorker::print()                                                
3  QtWebEngineCore::PrinterWorker::qt_static_metacall(QObject *, QMetaObject::Call, int, void * *)
4  QObject::event(QEvent *)                                                                        
5  QApplicationPrivate::notify_helper(QObject *, QEvent *)                                         
6  QApplication::notify(QObject *, QEvent *)                                                       
7  QCoreApplication::notifyInternal2(QObject *, QEvent *)                                         
8  QCoreApplicationPrivate::sendPostedEvents(QObject *, int, QThreadData *)                        
9  postEventSourceDispatch(_GSource *, int ( *)(void *), void *)                                   
10 g_main_context_dispatch                                                                         
11 ___lldb_unnamed_symbol354$$libglib-2.0.so.0                                                     
12 g_main_context_iteration                                                                        
13 QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)                      
14 QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>)                                         
15 QThread::exec()                                                                                 
16 QThreadPrivate::start(void *)                                                                   
17 start_thread                                                                                    
18 __GI___clone                                                                                    

【问题讨论】:

    标签: c++ qt qwebengineview


    【解决方案1】:

    您混淆了概念:loadFinished 是一个信号,而做if(&amp;QWebEnginePage::loadFinished) 没有意义(我建议您复习信号和槽的基本概念,因为它是 Qt 的基础:https://doc.qt.io/qt-5/signalsandslots.html)。

    另一方面,没有必要将 html 作为文件加载,因为您可以将 url 传递给它。

    考虑到上述情况,下面的代码是一个简单的打印示例:

    #include <QtWebEngineWidgets>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QWebEnginePage page;
        QPrinter printer(QPrinter::HighResolution);
        printer.setPageSize(QPrinter::A4);
        printer.setFullPage(true);
        printer.setOutputFormat(QPrinter::PdfFormat);
        printer.setOutputFileName("somefile.pdf");
        QObject::connect(&page, &QWebEnginePage::loadFinished, [&page, &printer](bool ok){
            if(ok){
                page.print(&printer, [](bool ok){
                    qDebug() << "printed " << ok;
                    QCoreApplication::quit();
                });
            }
            else{
                qDebug() << "Html Not loaded";
                QCoreApplication::exit(-1);
            }
        });
        page.load(QUrl::fromLocalFile("/home/hackerpoint/Desktop/some.html"));
        return a.exec();
    }
    

    更新:

    打印机类

    #ifndef PRINTER_H
    #define PRINTER_H
    
    #include <QObject>
    #include <QPrinter>
    #include <QWebEnginePage>
    
    class Printer: public QObject
    {
        Q_OBJECT
    public:
        enum PrinterError{
            NoError = 0,
            LoadError,
            PrintError
        };
        Q_ENUM(PrinterError);
        Printer(QObject *parent=nullptr);
    public Q_SLOTS:
        void print(const QString & html, const QUrl &baseUrl=QUrl());
        void print(const QUrl & url);
    Q_SIGNALS:
        void finished();
        void error(PrinterError error);
    private Q_SLOTS:
        void onFinished(bool ok);
    private:
        QPrinter printer;
        QWebEnginePage page;
    };
    
    #endif // PRINTER_H
    
    #include "printer.h"
    
    Printer::Printer(QObject *parent):QObject(parent)
    {
        printer.setResolution(QPrinter::HighResolution);
        printer.setPageSize(QPrinter::A4);
        printer.setFullPage(true);
        printer.setOutputFormat(QPrinter::PdfFormat);
        printer.setOutputFileName("somefile.pdf");
        connect(&page, &QWebEnginePage::loadFinished, this, &Printer::onFinished);
    }
    
    void Printer::print(const QString &html, const QUrl & baseUrl)
    {
        page.setHtml(html, baseUrl);
    }
    
    void Printer::print(const QUrl &url)
    {
        page.load(url);
    }
    
    void Printer::onFinished(bool ok)
    {
        if(ok){
            page.print(&printer, [this](bool ok){
                if(ok)
                    Q_EMIT finished();
                else
                    Q_EMIT error(PrintError);
            });
        }
        else
            Q_EMIT error(LoadError);
    }
    

    MainWindow 类:

    // ...
    private slots:
        void on_pushButton_clicked();
        void printError(Printer::PrinterError error);
        void printFinished();
    private:
        Ui::MainWindow *ui;
        Printer printer;
    // ...
    
    // ...
        ui->setupUi(this);
        connect(&printer, &Printer::finished, this, &MainWindow::printFinished);
        connect(&printer, &Printer::error, this, &MainWindow::printError);
    // ...
    void MainWindow::on_pushButton_clicked()
    {
        printer.print(QUrl::fromLocalFile("/home/hackerpoint/Desktop/some.html"));
    }
    
    void MainWindow::printError(Printer::PrinterError error)
    {
      if(error == Printer::LoadError){
          qDebug() << "Html Not loaded";
      }
      else if(error == Printer::PrintError){
          qDebug() << "Html Not printed";
      }
    }
    
    void MainWindow::printFinished()
    {
        qDebug() << "printed";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 2017-02-28
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多