HHz的编程日记 - 坑
type: channel
link: https://huanghaozi.com/index.php/tag/%E5%9D%91/
items: 打印页面设置灰的？只能出PDF？QTextView绘不进QPainter？涞康康这些C++Qt的神奇bug....

打印页面设置灰的？只能出PDF？QTextView绘不进QPainter？涞康康这些C++Qt的神奇bug....
type: item
date: 2020-05-09T22:00:00+08:00
description: 在这断更的两个星期里，有人找我破解一个硬件的串口通信过程，破解成功后，我用Qt编了个软件，万万没想到，在打印数据单这一功能的实现上竟花费了我三个小时。下面就涞康康Qt的这些bug是如何逼疯这个len的叭。（当然如果有同志已经被逼疯的也可以看看我的解决方法，欢迎copy代码） QPrintPreviewDialog这个类就是传说中Qt内置的打印预览类了，用法和效果是下面这样的：//建一个窗口，设置大小 QPrintPreviewDialog preview(&printer, this); preview.setMinimumSize(1000,600); //对这个窗口发的paintRequested信号事件作处理 //paintRequested意思就是请求绘制打印预览的内容 connect(&preview, SIGNAL(paintRequested(QPrinter*)), this, SLOT(printPreviewSlot(QPrinter*))); preview.exec();上图其实是我各种搜资料找到解决方案后的效果，在调试的过程中，我发现上面这个窗口中这个按钮是灰的，并且点击打印按钮仅仅弹出了导出为pdf的对话框：经过大量搜索，发现是要把Qt安装目录下版本号那个目录里对应编译器目录下的plugins下的printsupport整个文件夹复制到程序运行的目录下，才能正常使用打印、页面设置的功能。QTextDocument打印预览由于我需要打印的东西是个文档，我用word编辑了一顿，把它弄成了html，方便弄到QTextDocument作为富文本，进行打印。虽然QTextDocument内置的方法里有实现打印的功能，但并不能进行打印预览。于是我疯狂地搜，中英文地搜，可是怎么也找不到这样的话题....偶有找到这样的提问，却没有一个回答....于是我开始了漫长的看文档.... 之后就发现了QTextDocument中一个叫drawContents的方法，可以把它的内容整到QPainter上，而QPainter又可以直接在初始化参数里填上一个QPrinter对象，把东西绘制给打印机。当时我天真地以为直接用就行了：QPainter* painter = new QPainter(&printer); QTextDocument *doc = new QTextDocument; doc->drawContents(painter);然鹅虽然编译通过了，却怎么一步一步调试都没有效果... 这就离谱了，我又疯狂地搜....中英文地搜...仍然找不到这样的话题....最后我不知道怎么捣鼓的，写出了如下的代码，就能行了： QPainter* painter = new QPainter(printer); QTextDocument *doc = new QTextDocument; QSizeF paperSize; paperSize.setWidth(printer->width()); paperSize.setHeight(printer->height()); doc->documentLayout()->setPaintDevice(printer); //防止过小 doc->setPageSize(paperSize); doc->setHtml(html); doc->setDocumentMargin(10); //设置页边距 doc->drawContents(painter); //绘至QPainter /**********************************/ painter->end(); //重 要 操 作 /**********************************/万万没想到啊....