最近做了一个和QT5有关的项目,遇到很多问题也学习到不少,特意写下来希望帮到更多的人。(我的版本VS2017+QT5.12.0)
一、QT5截图并保存到本地
在头文件添加必须项

#include <QScreen>
#include <QPixmap>

截图功能的代码

    QScreen *screen=QGuiApplication::primaryScreen();QPixmap pixmap=screen->grabWindow(ui->qvtkWidget->winId());//qvtkWidget->winId()这是你要截图的控件的winID,主窗口0(全屏截图的意思)winId(0)pixmap.save("E:/screen.jpg","jpg"); //保存地址可以改成你自己的

二、QT5输出PDF/WORD文档(类似于打印报表)
添加头文件

#include <QPrinter>

输出带有文字的PDF

QPainter text_painter;
QPrinter text_printer;
text_printer.setOutputFormat(QPrinter::PdfFormat);
text_printer.setOutputFileName("test_text.pdf");
text_painter.begin(&text_printer);
for (int i = 0; i < 5; i++)text_painter.drawText(10, i * 30, "hello world");
text_painter.end();

输出带有图片的PDF

    QPrinter printer_pixmap(QPrinter::HighResolution);printer_pixmap.setPageSize(QPrinter::A4);  //设置纸张大小为A4printer_pixmap.setOutputFormat(QPrinter::PdfFormat);  //设置输出格式为pdfprinter_pixmap.setOutputFileName(sFilePdf1);   //设置输出路径QPainter painter_pixmap;//myImg是自定义的照片QPixmap pixmap(myImg);painter_pixmap.begin(&printer_pixmap);QRect rect = painter_pixmap.viewport();int multiple = rect.width()/pixmap.width();painter_pixmap.scale(multiple, multiple); //将图像(所有要画的东西)在pdf上放大multiple-1倍painter_pixmap.drawPixmap(0, 0, pixmap);  //画图painter_pixmap.end();

但我用这种方法始终无法生成带有图片的pdf文档,不知道哪里出了问题。就换了另一种方法,就可以生成文字图片都有的pdf文档。
核心思想就是以html语言为核心对pdf/word格式编写,再用QTextDocument输出。

头文件(我直接把我所有的都写出来了,你们可以根据自己的需求修改):

#include <QTextDocument>
#include <QtPrintSupport/QPrinter>
#include <QPainter>
#include <QPen>
#include <QTextBrowser>
#include <QPixmap>
#include <QDateTime>
#include <QDesktopWidget>
#include <QPdfWriter>
#include <QScreen>
#include <QFile>
#include <QTextBlock>

代码大致分为两部分:
第一部分:对文档格式编写(注意:格式可以根据自己需求改,书写格式遵循H5语言即可)

QString saveHtmlToPDF()
{QString html = "";html += "<html>";html += "<head>";html += "<title>qt生成pdf报表</title>";html += "<head>";html += "<body style=\"bgcolor:yellow\">";html += "<h1 align=\"center\">xxx报表</h1>";html += "<h2 align=\"left\">一.一级标题</h2>";html += "<h3 align=\"left\">1.二级标题</h3>";html += "<hr>";QString text;text = ui->textBrowser->document()->toHtml();//这里是将qt的文本控件内容直接输入给pdf文档html += text;html += "<hr>";html += "<h3 align=\"left\">2.图像数据</h3>";html += "<p align=\"left\">(1)图像名称1</p>";html += "<p align=\"center\"><img src=\"F:\\tabWidget_screen1.jpg\" alt=\"picture\" width=\"582\" height=\"400\"></p>";html += "<p align=\"left\">(2)图像名称2</p>";html += "<p align=\"center\"><img src=\"F:\\tabWidget_screen2.jpg\" alt=\"picture\" width=\"582\" height=\"400\"></p>";html += "<p align=\"left\">(3)图像名称3</p>";html += "<p align=\"center\"><img src=\"F:\\tabWidget_screen3.jpg\" alt=\"picture\" width=\"582\" height=\"400\"></p>";html += "<h2 align=\"left\">二.缺陷检测</h2>";html += "<h3 align=\"left\">1.总缺陷点云</h3>";html += "<p align=\"left\">(1)数量信息</p>";html += "<hr>"; //生成一条横线text = ui->lineEdit->text(); //获取控件的文本内容html += text;//文档结尾可以加上生成时间,看你自己选择。若要加上功能头文件还需添加 #include <QDateTime>html += "<p align=\"left\">报表生成时间:</p>";QDateTime current_date_time = QDateTime::currentDateTime();QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss");html += current_date;html += "</body>";html += "</html>";return html;
}

第二部分:将以上html转化成QT的文件输出文档

void picture2Pdf()
{QPrinter printer_pixmap(QPrinter::HighResolution);printer_pixmap.setPageSize(QPrinter::A4);  //设置纸张大小为A4printer_pixmap.setOutputFormat(QPrinter::PdfFormat);  //设置输出格式为pdfQString file_path = QFileDialog::getSaveFileName(this, "保存报表", QString(), "*.pdf");  //用文件对话框设置输出路径if (!file_path.isEmpty()){//如果没有写后缀就自动加上if (QFileInfo(file_path).suffix().isEmpty()){file_path.append(".pdf");  //或者 file_path+=".pdf"}}//若你pdf文档里插入的图片是截图qt界面,这部分代码则需要。若你pdf文档要插入的图片是本地自带的,则不需要这部分截图代码QScreen *screenNew = QGuiApplication::primaryScreen();QPixmap pixmapNew = screenNew->grabWindow(ui->qvtkWidget_2->winId());pixmap.save("E:/screen.jpg","jpg");//截图代码完毕,若你需要多次截图,更换grabWindow(ui->qvtkWidget_2->winId())中的内容即可QTextDocument document;QString html = saveHtmlToPDF();document.setHtml(html);document.print(&printer_pixmap);document.end();
}

若要生成word文档,只需要将第二部分函数中的

    QTextDocument document;QString html = saveHtmlToPDF();document.setHtml(html);document.print(&printer_pixmap);document.end();

更换为

    QString docname = "E:/testhtmlword.doc"; //文件保存地址也可更改为自定义位置,参考我上面的代码QString html = saveHtmlToWord(); //pdf中的函数名是saveHtmlToPDF()QFile outFile(docname);outFile.open(QIODevice::WriteOnly | QIODevice::Append );QTextStream ts(&outFile);ts<<html<<endl;

三、QT5输出PDF/WORD文档容易出现的问题
问题1:error LNK2019: 无法解析的外部符号 “_declspec(dllimport) public: __thiscall QPrintDialog::QPrintDialog(class QPrinter *,class QWidget *)” (__imp??0QPrintDialog@@QAE@PAVQPrinter@@PAVQWidget@@@Z),该符号在函数 “protected: void __thiscall EasyEditor::showPrintText(void)” (?showPrintText@EasyEditor@@IAEXXZ) 中被引用 F:\QtSourceCode\Easy Editor\Easy Editor\EasyEditor.objEasy Editor

解决方式:右击项目,选择“属性”–>“链接器”–>“输入”–>”附加依赖项”–>”编辑”
在最后添加上“Qt5PrintSupport.lib”即可。

问题2:使用QPrinter和QprintDialog类时的附加处理

解决方式:①若是在QT Creator中,需要在 (.pro)工程文件中加入 “QT+= printsupport ”,否则会编译报错
②若是在VS环境下,只需在相应头文件中添加以下两条语句(我上文分开提到过,这里集中说一下)

#include <QtPrintSupport/QPrintDialog>
#include <QtPrintSupport/QPrinter>

四、QT5中文乱码
1.QT5软件界面中文乱码(改变编码格式为utf-8,在cpp文件中设置编码字符集,只在VS编译器下生效)
解决:

#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif

2.QString中文乱码
解决:

QString str = QString::fromUtf8("中文");     // 源码是UTF-8 编码
QString str = QString::fromLocal8Bit("中文");    // 源码是GBK 编码(记事本中的 ANSI 编码)

这样两种方法也可以解决QT5输出的PDF/WORD中文乱码问题,总结一句中文乱码就是编码格式问题。

QT5 界面截图保存到本地+输出PDF/WORD格式文档+QT界面中文乱码及输出PDF中文乱码的解决(亲身实践并且成功)相关推荐

  1. linux excel pdf文件大小,为什么PDF这种格式文档运用得这么广泛

    原标题:为什么PDF这种格式文档运用得这么广泛 PDF文件格式是现在最常用的文件格式之一,在各行各业都得到了广泛的运用.与其他常见文件格式如Word或PPT文档相比(再加上我们可以使用专业的PDF阅读 ...

  2. PDFBox打印PDF A4格式文档和定制规格条码实例

    新接手一个打印终端的项目,要求可以打印A4格式的单据和 70mm * 40mm 规格的条码. 整体流程可分两种情况, 一种是将打印模板转换为pdf文档二进制数组,进而生成为pdf文档,保存到本地,然后 ...

  3. 关于论坛实现pdf,word等文档在线预览的功能探讨

    论坛引擎:Discuz! 2.5 工具:flexpaper1.5.6 二次开发版本 本文主要探讨大体的思路及相关技术难点问题,属个人工作之余的一些小小开发,仅供探讨,嘿嘿... 实现效果如图: 论坛为 ...

  4. 如何批量提取 PDF 文档内容,将 PDF 格式文档转为 Txt 文本格式

    概要:PDF 文档常常用来阅读.预览或者存档一些资料,PDF 支持的内容也是比较丰富的.可以支持图片.文本等多种类型的元素.那有时候我们就需要将一些纯文本的 PDF 文档中的文字提取出来,转为一个 T ...

  5. WEB自动化(4)使用selenium将网站验证码截图保存为本地图片

    WEB自动化(1)环境安装及打开浏览器实例 WEB自动化(2)常用的元素定位方法之xpath详解 WEB自动化(3)PO设计模式原理与实现 WEB自动化(4)使用selenium将网站验证码截图保存为 ...

  6. 删除在wps文档中的空白页,方便pdf输出无空白页

    解决问题 删除在wps文档中的空白页,方便pdf输出 解决思路两个 1. WPS中操作,从根上解决 2.Adobe 中对pdf操作,结果中解决 具体来讲: 1. WPS中操作,从根上解决 (1)点击& ...

  7. 在线文档的制作(包含txt,word,pdf,excel的文档类型,一应俱全哦)

    网上虽然有各种在线文档制作的教程但却没有一个集大成的,经过小亮同学不辞辛苦勤奋耕耘下终于制作出了相关的雏形,然后在下在稍加润色,这样一篇完整的博客便横空出世了- -,   下面则是分类进行介绍. 在分 ...

  8. php使用pdf2htmlex,转换 HTML 与 PDF 格式文档的神器

    企业 Web 项目开发中经常会有生产 PDF 格式文档的需求,例如 PDF 账单下载,月末生成各种统计报表等等.我们要帮助企业实现自动化,也就是说无需人工干预,程序能够按需从 DB 中拿数据自主生成. ...

  9. 【电脑办公软件有哪些】万彩办公大师教程丨PDF分割帮助文档

    关于万彩办公大师的PDF分割工具 PDF分割工具可以将PDF文档页面分割成更小的页面,用户完可以自由分割文档,以及对已分割输出的文档命名.这款PDF分割工具为大文件的分割提供了多种选择:不仅仅是居于页 ...

最新文章

  1. javascript各种小技巧
  2. EventSource
  3. 为什么销售员贷款比较难?
  4. apk源码查看工具_如何查看Linux命令工具的源码?
  5. LeetCode 252. 会议室(排序)
  6. 字符串模式匹配——最长公共子序列与子串 KMP 算法
  7. iMAG移动应用快速开发平台简介
  8. 直播电商只能卖便宜货吗?
  9. Unity连接本地数据库sqlite
  10. POJ2155 Matrix
  11. 怎样免费将Word导出为PDF格式?
  12. CVPR2019 accepted papers查看 以及其他几个顶级会议的accepted papers查看
  13. 模拟人生4修改服务器,模拟人生4常用秘籍与修改技巧心得
  14. Pygame实战之外星人入侵NO.7——大批外星人来袭
  15. html中切角文本框,HTML/CSS实现切角矩形效果
  16. 程序员的白酒里程(一)香型
  17. 微软Ribbon界面
  18. Roberts、Prewitt、Sobel、Laplacian、LoG 和 Canny 边缘检测算子(MATLAB自写函数实现)
  19. SpringBoot 搭建微信小程序支付(JSAPI) 纯后端
  20. Kotlin基础教程

热门文章

  1. 银河娱乐场官网:门禁系统 门禁自动化是关键 降低门禁系统维运成本
  2. 玩具CE认证安全指令2009/48 / EC
  3. 【bzoj1012】[JSOI2008]最大数maxnumber st表
  4. Windows API简单实例
  5. PHP获取一个月有多少天
  6. 基于DDD的abp模式的新框架
  7. ACM常用的解题技巧:尺取法及相关例题
  8. 如何在计算机上取消打印,打印机如何取消打印任务
  9. 深度学习与计算机视觉(PB-13)—ImageNet数据集准备
  10. 统计正数和负数的个数然后计算这些数的平均值_描述性统计-统计学基础