在这断更的两个星期里,有人找我破解一个硬件的串口通信过程,破解成功后,我用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(); //重 要 操 作
/**********************************/
万万没想到啊....