先描述一下背景
打印机:ZD888
打印方式:qpainter绘制打印
纸张大小:70mm*70mm
问题
如果没有设置打印位置的偏移,就是这句代码QRectF textRect(0, 0, printer->width(), printer->height());,也就是这里的x,y是0,那么可以出纸,但是位置不对,如果不是零打印机选择开始扫描没反应,比如是10,直接就不出纸,打印机指示灯闪烁两次 ,就没反应了。也找不到原因,完全无从下手的感觉,后来实在没办法了,我想尝试用wps去打印试试,谁成想,在设置纸张尺寸时候发现了问题,下面开始贴图解释
我圈起来的是wps从打印机读到的纸张尺寸
下面这张图是在斑马打印机设置软件里设置的纸张尺寸
可以看到,wps从打印机读取到的尺寸竟然比实际尺寸小了一毫米,我猜测额,wps应该是读取了打印机的dpi或其他参数换算出来的这个69mm,这中间应该是有四舍五入过,也就是按dpi计算出来的实际尺寸应该是69mm,斑马的这款软件应该也是对用户输入值70mm做过处理的,毕竟人家就是干这行的,只有我自己傻傻的在qt的代码里直接设置尺寸为70mm,后来把70换成69马上就OK了,一切都正常了,最后贴上出问题的代码
出问题的代码
//打印按钮下的代码
QPrinter printer(QPrinter::HighResolution);
//QPrinter printer;
printer.setPrinterName(ui->cbx_printerList->currentText());
// 设置纸张尺寸为70mm*70mm
printer.setPageSize(QPrinter::Custom);
qDebug()<<printer.widthMM();
qDebug()<<printer.heightMM();
qDebug()<<printer.margins().left;
qDebug()<<printer.margins().top;
qDebug()<<printer.margins().bottom;
qDebug()<<printer.margins().right;
printer.setPageSizeMM(QSizeF(70,70));
//printer.setPageSize(QPageSize(QSizeF(70, 70), QPageSize::Millimeter));
printer.setPageMargins(0,0,0,0,QPrinter::Millimeter);
printer.setFullPage(true);
QPrintPreviewDialog preview(&printer, this);
connect(&preview, &QPrintPreviewDialog::paintRequested, this, &PrinterBaseSetup::printSlots);
preview.exec();
//预览确认槽函数
//创建画家对象,开始绘制
QPainter painter(printer);
// 设置字体和文本颜色
QFont font("宋体", 10);
painter.setFont(font);
painter.setPen(Qt::black);
// 绘制文本,注意要设置绘制区域和对齐方式
//qDebug()<<"打印机默认宽高:"<width()<<","<height();
QRectF textRect(100, 100, printer->width(), printer->height());
painter.drawText(textRect, Qt::AlignTop, "今天是个好日子");
// 结束绘制,释放资源
painter.end();
结语 这篇博客里用到了几次猜测这个词,这对于搞技术的是非常不严谨的一件事,可是打印机选择开始扫描没反应,没有可是,可是我还是得说,计算机学科发展到今天,各种编程语言,路线,领域等等各种细分浩瀚如烟海,谁都不敢说自己了解计算机学科某个分支的所有知识,而在面对实际项目的时候又势必会触及到一些不是自己专业领域的知识,这个时候猜测,估算可以不浪费时间,我不敢说他能节省时间,起码它可以帮助我们不浪费时间,其实坐下来把QPainter和QPrinter啃完也是没问题的,可是项目交期不会因为我要啃这些知识而延后。 而且此处的猜测,并不真的就是猜测,我更倾向于这是我们大脑中现有的知识体系对眼前问题的估算,只是我们没办法描述这个估算的过程,甚至浑然不自知。
版权声明
本文仅代表作者观点。
本文系作者授权发表,未经许可,不得转载。
发表评论