1,利用 qrencode 第三方库 生成二维码,并通过Qt printer调用打印机 打印条码 或者二维码。
2,经过和同事几天的研究,浪费了一筐 条码之后。终于实现了基本功能,一些关键细节分享出来。
(1),打印机设置,颜色模式,纸张单位,大小,分辨率,边距,水平还是垂直。
此处 分辨率为 打印机固有属性,可通过windows驱动查看。
mPrinter->setColorMode(QPrinter::GrayScale);
mPrinter->setPageSizeMM(QSizeF(49.8,35.0)); //大小
mPrinter->setPaperSize(QSizeF(49.8,35), QPrinter::Millimeter);
mPrinter->setResolution(300);//分辨率 203
mPrinter->setPageMargins(0,0,0,0, QPrinter::Millimeter);
mPrinter->setOrientation(QPrinter::Portrait);
mPrinter->setFullPage(true);
(2),二维码设置
开始模式,纠错等级,版本。二维码相关属性可 百度搜索。
mode = MODE_8;
level = LEVEL_L;//LEVEL_Q;//纠错
foreground = QColor("black");
background = QColor("white");
casesen=true;
mPrinter = new QPrinter(QPrinter::PrinterResolution);
(3),打印文字
此处 double MmToDot =12 为上述 分辨率 也即是300/24.5 得出的结果,表示 没英寸多少个点。我们在计算文字位置的时候 最好用毫米,而
QRect 内所需的参数为像素点,换算成毫米 就要乘以一个系数。
double MmToDot =12 ;//分辨率/24.5MM 每毫米多少像素点 。
QPainter painter(mPrinter);
//文字 x:3mm y:27mm 宽:28mm 高:4mm
double codeTextX=0*MmToDot;
double codeTextY=24*MmToDot;
double codeTextW=28*MmToDot;
double codeTextH=4*MmToDot;
QRect codeTextRect = QRect(codeTextX,codeTextY,codeTextW,codeTextH);
painter.setFont(QFont("Microsoft YaHei", 8, QFont::Normal));
painter.drawText(codeTextRect, Qt::AlignCenter, codeText);
(4),打印 二维码
//二维码图片 x:42mm y:17mm 宽::14MM 高:14mm
double qrcodeX =35*MmToDot;
double qrcodeY =17*MmToDot;
double qrcodeW =10*MmToDot;
double qrcodeH =10*MmToDot;
//ver 1 版本越高,意味着存储的内容越多,纠错能力也越强
QRcode *qrcode = QRcode_encodeString(codeText.toStdString().c_str(), 1, (QRecLevel)level, (QRencodeMode)mode, casesen ? 1 : 0);
int margin=0;
if(0 != qrcode)
{
unsigned char *point = qrcode->data;
painter.setPen(Qt::NoPen);
painter.setBrush(this->background);
painter.drawRect(qrcodeX,qrcodeY, qrcodeW, qrcodeH);
double scale = (qrcodeW - 2.0 * margin) / qrcode->width;
painter.setBrush(this->foreground);
for (int y = 0; y < qrcode->width; y ++) {
for (int x = 0; x < qrcode->width; x ++) {
if (*point & 1) {
QRectF r(margin + x * scale+qrcodeX, margin + y * scale+qrcodeY, scale, scale);
painter.drawRects(&r, 1);
}
point ++;
}
}
point = NULL;
QRcode_free(qrcode);
}
qrcode = NULL;
(5),打印条码
QFont barcodefont = QFont("Code 128", 46, QFont::Normal);
barcodefont.setLetterSpacing(QFont::AbsoluteSpacing,0.0);
painter.setFont(barcodefont);
QString arr = encodeBarcode(codeText);
painter.drawText(barcodeRect, Qt::AlignCenter, arr);
(6),上述 实现之后,可实现 条码 或二维码 与文字的打印,并可以毫米为单位 进行位置的调整。但是打印出来的效果特别模糊,经过又一筐条码的浪费,终于找到了问题所在。打印机的 浓度 和速度。将速度调低、将浓度 增大
控制面板-》打印机-》右键 -》打印机首选项
代码: http://download.csdn.net/download/weixin_38416696/10248658