简体   繁体   English

如何在Qt中打印QWidget?

[英]How can I print a QWidget in Qt?

I need to know how to print a QWidget as a PDF file. 我需要知道如何将QWidget打印为PDF文件。 The Widget (QDialog) contains a lot of labels, some QPlainTextEdit and a background image. Widget(QDialog)包含许多标签,一些QPlainTextEdit和一个背景图像。 The Dialog shows a receipt with all of its field already filled. 对话框显示已收到所有字段的收据。

I already tried using QTextDocument and html for this purpose, but the complexity of the receipt(lots of image and format customisation) makes the html output completely messed up. 我已经尝试过为此目的使用QTextDocument和html,但收据的复杂性(大量图像和格式自定义)使得html输出完全搞砸了。

This is the document. 这是文件。

Receipt image 收据图片

You have to use QPrinter and this is the object that you must use and requires QPainter to draw the widget in QPrinter . 您必须使用QPrinter ,这是您必须使用的对象,并且需要QPainterQPrinter绘制窗口小部件。

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().center());
        painter.scale(scale, scale);
        painter.translate(-w.width()/ 2, -w.height()/ 2);
        w.render(&painter);
    });

    return a.exec();
}

Widget: 小工具:

在此输入图像描述

output.pdf 输出.pdf

在此输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM