Qt实现 二维码打印功能

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),上述 实现之后,可实现 条码 或二维码 与文字的打印,并可以毫米为单位 进行位置的调整。但是打印出来的效果特别模糊,经过又一筐条码的浪费,终于找到了问题所在。打印机的 浓度 和速度。将速度调低、将浓度 增大

 

控制面板-》打印机-》右键 -》打印机首选项

Qt实现 二维码打印功能_第1张图片

 

代码:  http://download.csdn.net/download/weixin_38416696/10248658

你可能感兴趣的:(Qt)