2014-09-25 48 views
0

如何打印未在窗口/小部件上显示的页面? Qt的代码: 转换视图打印未显示的网页

QPainter painter(printer); 
m_webView->page()->setViewportSize(m_pageToPrint->mainFrame()->contentsSize()); 
painter.scale(scale, scale); 
m_pageToPrint->mainFrame()->render(&painter); 

要复制到剪贴板,开关以纯文本模式 这是所使用的代码(现在是从m_webView转换为m_pageToPrint)打印从web视图的页面,这是表明,但没有显示m_pageToPrint的代码,只加载要打印的HTML?上述代码的结果是PrinterPreviewer中的白页。 这是加载的HTML代码和后给预览拨打: Qt的代码: 转换视图

m_pageToPrint->mainFrame()->setHtml(finalHTML); 
m_printPreviewDialog->exec(); 

要复制到剪贴板,开关以纯文本模式 finalHTML是一个有效的HTML代码。

回答

0

我使用此代码打印我的HTML报告页面:

reportprint.h

class ReportPrint : public QObject 
{ 
    Q_OBJECT 
    public: 
     ReportPrint(QObject *parent = 0); 
     void printHTML(QUrl url); 
    private: 
     QWebView m_webView; 
     QPrinter m_printer; 
     QPrintPreviewDialog *m_preview; 
    protected slots: 
     void printReady(bool enable); 
     void paintRequested(QPrinter*printer); 
} 

reportprint.cpp

ReportPrint::ReportPrint(QObject *parent) : 
    QObject(parent) { 
    connect(&m_webView, SIGNAL(loadFinished(bool)),this, SLOT(printReady(bool))); 
} 

void ReportPrint::printHTML(QUrl url) { 
    m_webView.page()->settings()->clearMemoryCaches(); 
    // here I point to directory which contains printed html file so the engine can found css files 
    QUrl base = QUrl::fromLocalFile(QApplication::applicationDirPath() + "templates/");   
    m_webView.setHtml(url,base); 
} 

void ReportPrint::printReady(bool enable) { 
    if(print_to_default_printer) { 
     QString pn = QPrinterInfo::defaultPrinter().printerName(); 
     m_printer.setPrinterName(pn); 
     m_printer.setOutputFormat(QPrinter::NativeFormat); 
     m_webView.print(&m_printer); 
    } else if(print_with_preview) { 
     m_preview = new QPrintPreviewDialog(&p_printer);     
     connect(m_preview,SIGNAL(paintRequested(QPrinter*)), 
       this,SLOT(paintRequested(QPrinter*))); 
    } 

} 

void ReportPrint::paintRequested(QPrinter *printer) { 
    m_printer.setOutputFormat(QPrinter::NativeFormat); 
    m_webView.print(printer); 
    m_preview->deleteLater(); 
}