2017-08-02 66 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