2017-08-02 68 views
1

我需要知道如何將QWidget打印爲PDF文件。 Widget(QDialog)包含很多標籤,一些QPlainTextEdit和一個背景圖片。對話框顯示收據的所有字段已經填滿。如何在Qt中打印QWidget?

我已經嘗試過使用QTextDocument和html用於此目的,但收據(大量圖像和格式自定義)的複雜性使得html輸出徹底搞砸了。

這是文檔。

的票據圖像

+1

可以顯示一個[最小,完整的,並且可驗證示例](https://stackoverflow.com/help/mcve)。 – eyllanesc

+0

我試過QWidget :: render()解決方案,但沒有工作,給我看這個錯誤: 「QPainter :: begin:繪製設備返回的引擎== 0,類型:2」 「QWidget :: render:無法呈現與一個不活躍的畫家「 –

+0

有什麼錯誤? – eyllanesc

回答

4

你必須使用QPrinter,這是你必須使用,並要求QPainter繪製控件在QPrinter的對象。

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QDialog w; 

    w.setLayout(new QVBoxLayout()); 
    w.layout()->addWidget(new QLineEdit("text")); 
    w.layout()->addWidget(new QPushButton("btn")); 
    w.layout()->addWidget(new QPlainTextEdit("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris rutrum magna semper nisi faucibus, at auctor dolor ullamcorper. Phasellus facilisis blandit augue sit amet placerat. Aliquam nec imperdiet diam. Proin dignissim vulputate metus, nec tincidunt magna vulputate ac. Praesent vel felis ac dolor viverra tempus eu vitae neque. Nulla efficitur gravida arcu id suscipit. Maecenas placerat egestas velit quis interdum. Nulla diam massa, hendrerit vitae mi et, placerat aliquam nisl. Donec tincidunt lobortis orci, quis egestas augue tempus sed. Nulla vel dolor eget ipsum accumsan placerat ut at magna.")); 
    w.show(); 

    QPushButton btn("print"); 
    btn.show(); 

    QObject::connect(&btn, &QPushButton::clicked, [&w](){ 
     QPrinter printer(QPrinter::HighResolution); 
     printer.setOutputFormat(QPrinter::PdfFormat); 
     printer.setOutputFileName("output.pdf"); 
     printer.setPageMargins(12, 16, 12, 20, QPrinter::Millimeter); 
     printer.setFullPage(false); 

     QPainter painter(&printer); 

     double xscale = printer.pageRect().width()/double(w.width()); 
     double yscale = printer.pageRect().height()/double(w.height()); 
     double scale = qMin(xscale, yscale); 
     painter.translate(printer.paperRect().x() + printer.pageRect().width()/ 2, 
          printer.paperRect().y() + printer.pageRect().height()/2); 
     painter.scale(scale, scale); 
     painter.translate(-w.width()/ 2, -w.height()/ 2); 
     w.render(&painter); 
    }); 

    return a.exec(); 
} 

窗口小部件:

enter image description here

輸出.pdf

enter image description here

+0

這很好用,非常感謝。我幾乎肯定我也試過,但由於某種原因,它不起作用,也許我寫了一些錯誤的論點。回答標記爲已接受。 –

+0

@AlexeySmirnov請將您錯誤放置的參數置於正確的位置,但這個問題已關閉,因爲他們會認爲它是重複的。 – eyllanesc