【问题标题】:How can I print a QWidget in Qt?如何在 Qt 中打印 QWidget?
【发布时间】:2018-01-10 02:21:52
【问题描述】:

我需要知道如何将 QWidget 打印为 PDF 文件。 Widget (QDialog) 包含很多标签、一些 QPlainTextEdit 和背景图像。对话框显示已填写所有字段的收据。

我已经尝试为此目的使用 QTextDocument 和 html,但是收据的复杂性(大量图像和格式自定义)使得 html 输出完全混乱。

这是文件。

收据图片

【问题讨论】:

  • 您可以显示您的小部件的Minimal, Complete, and Verifiable example
  • 我尝试了 QWidget::render() 解决方案,但没有奏效,向我显示此错误:“QPainter::begin: Paint device returned engine == 0, type: 2”“QWidget::渲染:无法使用不活跃的画家进行渲染”
  • 什么是错误?
  • 答案已编辑*,误按了输入
  • Edit 您的问题并显示您尝试过的方法,即使它不起作用,以及您的问题的mvce

标签: c++ qt printing qt5 qwidget


【解决方案1】:

您必须使用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();
}

小部件:

输出.pdf

【讨论】:

  • 效果很好,非常感谢。我几乎可以肯定我也试过这个,但由于某种原因它不起作用,也许我写了一些错误的论点。答案标记为已接受。
  • @AlexeySmirnov 请放置您错误放置的参数,但此问题已关闭,因为他们会认为它是重复的。
猜你喜欢
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 2014-09-04
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多