QT5 界面截图保存到本地+输出PDF/WORD格式文档+QT界面中文乱码及输出PDF中文乱码的解决(亲身实践并且成功)
最近做了一个和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中文乱码的解决(亲身实践并且成功)相关推荐
- linux excel pdf文件大小,为什么PDF这种格式文档运用得这么广泛
原标题:为什么PDF这种格式文档运用得这么广泛 PDF文件格式是现在最常用的文件格式之一,在各行各业都得到了广泛的运用.与其他常见文件格式如Word或PPT文档相比(再加上我们可以使用专业的PDF阅读 ...
- PDFBox打印PDF A4格式文档和定制规格条码实例
新接手一个打印终端的项目,要求可以打印A4格式的单据和 70mm * 40mm 规格的条码. 整体流程可分两种情况, 一种是将打印模板转换为pdf文档二进制数组,进而生成为pdf文档,保存到本地,然后 ...
- 关于论坛实现pdf,word等文档在线预览的功能探讨
论坛引擎:Discuz! 2.5 工具:flexpaper1.5.6 二次开发版本 本文主要探讨大体的思路及相关技术难点问题,属个人工作之余的一些小小开发,仅供探讨,嘿嘿... 实现效果如图: 论坛为 ...
- 如何批量提取 PDF 文档内容,将 PDF 格式文档转为 Txt 文本格式
概要:PDF 文档常常用来阅读.预览或者存档一些资料,PDF 支持的内容也是比较丰富的.可以支持图片.文本等多种类型的元素.那有时候我们就需要将一些纯文本的 PDF 文档中的文字提取出来,转为一个 T ...
- WEB自动化(4)使用selenium将网站验证码截图保存为本地图片
WEB自动化(1)环境安装及打开浏览器实例 WEB自动化(2)常用的元素定位方法之xpath详解 WEB自动化(3)PO设计模式原理与实现 WEB自动化(4)使用selenium将网站验证码截图保存为 ...
- 删除在wps文档中的空白页,方便pdf输出无空白页
解决问题 删除在wps文档中的空白页,方便pdf输出 解决思路两个 1. WPS中操作,从根上解决 2.Adobe 中对pdf操作,结果中解决 具体来讲: 1. WPS中操作,从根上解决 (1)点击& ...
- 在线文档的制作(包含txt,word,pdf,excel的文档类型,一应俱全哦)
网上虽然有各种在线文档制作的教程但却没有一个集大成的,经过小亮同学不辞辛苦勤奋耕耘下终于制作出了相关的雏形,然后在下在稍加润色,这样一篇完整的博客便横空出世了- -, 下面则是分类进行介绍. 在分 ...
- php使用pdf2htmlex,转换 HTML 与 PDF 格式文档的神器
企业 Web 项目开发中经常会有生产 PDF 格式文档的需求,例如 PDF 账单下载,月末生成各种统计报表等等.我们要帮助企业实现自动化,也就是说无需人工干预,程序能够按需从 DB 中拿数据自主生成. ...
- 【电脑办公软件有哪些】万彩办公大师教程丨PDF分割帮助文档
关于万彩办公大师的PDF分割工具 PDF分割工具可以将PDF文档页面分割成更小的页面,用户完可以自由分割文档,以及对已分割输出的文档命名.这款PDF分割工具为大文件的分割提供了多种选择:不仅仅是居于页 ...
最新文章
- javascript各种小技巧
- EventSource
- 为什么销售员贷款比较难?
- apk源码查看工具_如何查看Linux命令工具的源码?
- LeetCode 252. 会议室(排序)
- 字符串模式匹配——最长公共子序列与子串 KMP 算法
- iMAG移动应用快速开发平台简介
- 直播电商只能卖便宜货吗?
- Unity连接本地数据库sqlite
- POJ2155 Matrix
- 怎样免费将Word导出为PDF格式?
- CVPR2019 accepted papers查看 以及其他几个顶级会议的accepted papers查看
- 模拟人生4修改服务器,模拟人生4常用秘籍与修改技巧心得
- Pygame实战之外星人入侵NO.7——大批外星人来袭
- html中切角文本框,HTML/CSS实现切角矩形效果
- 程序员的白酒里程(一)香型
- 微软Ribbon界面
- Roberts、Prewitt、Sobel、Laplacian、LoG 和 Canny 边缘检测算子(MATLAB自写函数实现)
- SpringBoot 搭建微信小程序支付(JSAPI) 纯后端
- Kotlin基础教程