在项目开发过程中,涉及到打印机的使用,很幸运,Qt的打印机模块printsupport的支持是的打印简单些。
在查询打印模块的类时,体会到Qt的对于这种硬件的结构层次的封装,数据库等类结构也是如此。我的见解如下,提供custom core和widget。
core
- QPrinterInfo,对已存在的打印机的封装。
- QPrinter,打印的执行体。
widget
- QPrintDialog,打印设置弹窗,一般不可见,代码中设置相关参数。
- QPrintPreviewDialog,打印预览弹窗。
本次主要说说,富文本的打印,即将html文本打印出来,由于使用的打印机经常是custom打印机,需要明白一下的接口含义。
// 获取可用打印设备
QList<QPrinterInfo> printerList = QPrinterInfo::availablePrinters();
// 默认打印设备 eg,标准打印
QPrinterInfo defaultPrinter = QPrinterInfo::defaultPrinter();
defaultPrinter.defaultPageSize();// eg:A4 (210 x 297 mm)
defaultPrinter.defaultPageSize().definitionUnits();// eg:纸张单位 eg:mm
defaultPrinter.defaultPageSize().definitionSize();// eg:210 x 297
defaultPrinter.supportedPageSizes();// 可选的打印纸张大小 eg:A3 B.....
// 根据打印机名称指定,eg:sony的自定义
QPrinterInfo sonyPrinter = QPrinterInfo::printerInfo(QString("Sony UP-898 Series"));
sonyPrinter.defaultPageSize();// eg:960x1280【custom 30】(230p x 312p)
sonyPrinter.defaultPageSize().definitionUnits();// eg:point 即一英寸的1/72
sonyPrinter.defaultPageSize().definitionSize();// eg:230px312p
sonyPrinter.supportedPageSizes();// 可选大小
sonyPrinter.supportsCustomPageSizes();// 是否支持自定义尺寸纸张
- defaultPageSize,指定该打印机默认纸张大小,就是我们所说的A3,A4....
- definitionUnits,纸张所使用的单位,ISO为mm,ANSI为英寸,sony使用的是point , 1point = 1/72in
- definitionSize,纸张尺寸,仅仅是数据。
QPrinter printer;
// per in has dots number, 打印机绘制引擎
printer.logicalDpiX(); printer.logicalDpiY();
// 物理分辨率
printer.physicalDpiX(); printer.physicalDpiY();
关于打印机设备的分辨率,我们使用逻辑Dpi。
实践中,我们html文本要与纸张的尺寸进行尺寸映射即可。
/*****富文本打印**********/
QPagedPaintDevice::Margins marg;
marg.left = 0;
marg.right = 0;
marg.top = 0;
marg.bottom = 0;
QPrinter printer;
printer.setOutputFormat(QPrinter::NativeFormat);
printer.setPageSize(QPrinter::Custom); //自定义纸张大小
printer.setPaperSize(QPrinter::Custom);
printer.setMargins(marg);
//富文本打印
QString strHtml;
QTextDocument textDocument;
textDocument.setDefaultFont(QFont("宋体", 18, QFont::Medium));
textDocument.setHtml(strHtml);
textDocument.setDocumentMargin(0);
//获取当前打印机的正使用的pageSize
QPrinterInfo info = QPrinterInfo::defaultPrinter();
QSizeF defaultSize = info.defaultPageSize().definitionSize();
//计算打印机的实际pageSize dpiX*inch 即分辨率*英寸
QSizeF s = QSizeF(printer.logicalDpiX() * (defaultSize.width() / 72), printer.logicalDpiY() * (defaultSize.height() / 72)); //设置打印大小
//将textDocument的pageSize同与打印机逻辑尺寸
textDocument.setPageSize(s);
if(true){
// 打印html
textDocument.print(&printer);
}
else{
// 将要打印的html进行图片保存
QImage image = QImage(s.width(), s.height(), QImage::Format_RGB888);
QPainter painter(&image);
textDocument.drawContents(&painter);
image.save("D:\\qwewqe.jpg", "jpg", 100);
}
- help 1in = 25.4mm 1point = 1/72in