如何在 Qt 中打印 QWidget?

2023-12-06

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

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

这是文件。

收据图片


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

    return a.exec();
}

Widget:

enter image description here

输出.pdf

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Qt 中打印 QWidget? 的相关文章

随机推荐

  • 如何在 C# 中从 Json 字符串中检索值

    我收到类似的回复 expires Sat 19 May 2046 04 10 58 0000 copy ref SMJNA2wxbGZbnmbnm Result null error null base expires Sat 19 May
  • 如何将 application/json 对象解析为字符串

    我正在以编程方式导航到返回 application json 格式的站点 我似乎无法读取 HttpURLConnection 中返回的 json 我正在使用 Jackson 将 JSON 解组到 java 对象中 代码是 InputStre
  • 最有用的 R 技巧是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 Locked 这个问题及其
  • Java中有常用的有理数库吗?

    我正在寻找一个代表分数 有理数 的Java 库 例如 如果我想存储分数1 3那么它不会被另存为0 33333这将失去其准确性 以下是我期望在此类库中找到的一些功能 getNumerator getDenominator add Ration
  • 多个标头和 ARIA 角色

    我有一个 HTML 结构 它实际上有 2 个标题 在页面的顶部有一些导航项和按钮 下面是另一个部分 其中包含徽标和我所说的主导航 由于全宽 CSS3 渐变 两者都在包装器中被分割 所以我的结构看起来像这样 div div div div
  • 使用 ffmpeg、PHP 和 beanstalk

    我对 ffmpeg 和 beanstalk 很陌生 我需要一些帮助 我想使用 beanstalk 将文件排队以供 ffmpeg 转换 我已经下载 安装并启动了 beanstalkd 还按照建议安装了 libevent 并且我已经下载了 be
  • 用于数字动画的 Jquery 插件

    我正在对服务器进行 ajax 调用 然后更新一些统计信息 我想要一个可以为数字添加动画的插件 例如初始值 65 ajax调用后的值 98 在 2 秒内 显示的值从 65 增加到 98 用户可以看到这一点 就像数字速度表或转速表一样 我的搜索
  • iOS 应用程序在后台时的 GCM 推送通知

    我正在尝试使用 GCM 将推送通知发送到我的 iOS 应用程序 应用程序在后台时不会收到通知 但在前台时会收到通知 我正在使用 PHP 脚本测试推送通知 该脚本还将消息直接发送到 APNS 并且它在后台工作 发送到 GCM 的 JSON 我
  • 将带有图像的 NSAttributedString 保存到 RTF 文件时遇到问题

    我有一些输出 是一个非常简单的 RTF 文件 当我生成此文档时 用户可以通过电子邮件发送它 这一切都运行良好 该文档看起来不错 一旦我有了 NSAttributedString 我就创建一个 NSData 块 并将其写入文件 如下所示 NS
  • 并行输出

    当使用多个进程运行 CMake 生成的 Makefile 时 make jN 输出经常会像这样混乱 8 8 9 Building CXX object App CMakeFiles App dir src File1 cpp o Build
  • JavaFX 8 的基本 JUnit 测试

    我想为 JavaFX 8 应用程序创建基本的 JUnit 测试 我有这个简单的代码示例 public class Main extends Application public static void main String args Ap
  • SQLAlchemy - 在 postgresql 中执行批量更新插入(如果存在,则更新,否则插入)

    我正在尝试使用 SQLAlchemy 模块 而不是 SQL 在 python 中编写批量更新插入 我在 SQLAlchemy 添加中收到以下错误 sqlalchemy exc IntegrityError IntegrityError du
  • 避免打印最后一个逗号

    我正在尝试打印这个循环而不使用最后一个逗号 我一直在谷歌上搜索这个问题 从我所看到的来看 对于这么一个小问题来说 一切似乎都过于复杂 当然有一个简单的解决方案可以避免打印最后一个逗号 如果有人能帮助我 我将不胜感激 这让我发疯 例如 它从
  • 如何获取出现频率最高的值SQL

    我有一个表 Orders id trip id order 表 Trip id hotel id bus id type of trip 和表 Hotel id hotel name 我想获取表订单中最常去的酒店的名称 SELECT hot
  • Avro 生成的类与 json 转换有关的问题 [kotlin]

    我在编组 解组时遇到一个奇怪的问题avro生成的类 我收到的错误是抛出一个不是枚举错误 除非我的班级中没有任何枚举 错误具体是这样的 com fasterxml jackson databind JsonMappingException 不
  • img 标题属性显示块而不是外来字符

    我网站上的一些图片有title包含外来字符的属性 这些字符在网站的其余部分和 HTML 源代码中正确显示 但在小浏览器标题悬停上显示不正确 悬停 别处 Source img width 288 height 145 src http www
  • 返回上传到 firebase 的文件的下载 URL

    有没有一种简单的方法来获取上传到 Firebase 的文件的下载 URL 我尝试过使用我的上传函数返回的快照 但找不到任何东西 fileref put file then function snapshot self addEntry sn
  • Django 异常:django.core.exceptions.ImproperlyConfigured:

    当我在 django shell 中运行相同的代码时 它对我来说工作得很好 但是当我启动Python解释器 Python 2 来检查一些东西时 我在尝试导入时收到错误 from django contrib auth models impo
  • 无法在 Flutter 应用程序中加载当前位置

    我正在使用地理定位器插件并获取当前的纬度和经度 但我无法在 Flutter 应用程序的 initstate 中加载它 它显示渲染错误 void initState TODO implement initState super initSta
  • 如何在 Qt 中打印 QWidget?

    我需要知道如何将 QWidget 打印为 PDF 文件 Widget QDialog 包含很多标签 一些 QPlainTextEdit 和一个背景图像 该对话框显示一张收据 其所有字段均已填写 我已经尝试使用 QTextDocument 和