QT 条形码打印 code128c 编码 偶数位编码打印


QString AddCodeTag(int codeindex){
 QString res = "";
 // <summary>1-4的条的字符标识 </summary>
 QStringList TagB;
 TagB << "" << "b" << "bb" << "bbb" << "bbbb";
 // <summary>1-4的空的字符标识 </summary>
 QStringList TagS;
 TagS << "" << "s" << "ss" << "sss" << "ssss";
 QStringList Code128List;
 Code128List << "212222"<<"222122"<<"222221"<<"121223"<<"121322"<<"131222"<<"122213"<<"122312"<<"132212"<<"221213"<<
 "221312"<<"231212"<<"112232"<<"122132"<<"122231"<<"113222"<<"123122"<<"123221"<<"223211"<<"221132"<<
 "221231"<<"213212"<<"223112"<<"312131"<<"311222"<<"321122"<<"321221"<<"312212"<<"322112"<<"322211"<<
 "212123"<<"212321"<<"232121"<<"111323"<<"131123"<<"131321"<<"112313"<<"132113"<<"132311"<<"211313"<<
 "231113"<<"231311"<<"112133"<<"112331"<<"132131"<<"113123"<<"113321"<<"133121"<<"313121"<<"211331"<<
 "231131"<<"213113"<<"213311"<<"213131"<<"311123"<<"311321"<<"331121"<<"312113"<<"312311"<<"332111"<<
 "314111"<<"221411"<<"431111"<<"111224"<<"111422"<<"121124"<<"121421"<<"141122"<<"141221"<<"112214"<<
 "112412"<<"122114"<<"122411"<<"142112"<<"142211"<<"241211"<<"221114"<<"413111"<<"241112"<<"134111"<<
 "111242"<<"121142"<<"121241"<<"114212"<<"124112"<<"124211"<<"411212"<<"421112"<<"421211"<<"212141"<<
 "214121"<<"412121"<<"111143"<<"111341"<<"131141"<<"114113"<<"114311"<<"411113"<<"411311"<<"113141"<<
 "114131"<<"311141"<<"411131"<<"211412"<<"211214"<<"211232";
 QString tag = Code128List.at(codeindex);
 for (int i = 0; i < tag.length(); i++)
 {
 QString temp = "";
 int num = QString(tag.at(i)).toInt();
 if(i % 2 == 0)
 temp = TagB.at(num);
 else
 temp = TagS.at(num);
 res += temp;
 }
 return res;
}
QString getCode128CString(QString codestr){
 QString barstart = "bbsbssbbbss"; //码头
 QString barbody = ""; //码身
 QString barcheck = ""; //码检
 QString barend = "bbsssbbbsbsbb"; //码尾
 int checkNum = 105;
 //循环添加码身,计算码检
 int strlen = codestr.length();
 if(strlen == 0)
 return "";
 else if(strlen%2 != 0)
 {
 codestr+="0";
 strlen += 1;
 }
 for (int i =0,j=1; i < strlen; i+=2,j++)
 {
 int index = codestr.mid(i,2).toInt();
 checkNum += (index * j);
 barbody += AddCodeTag(index);//加入字符值的条码标记
 }
 //码检值计算
 barcheck = AddCodeTag(QString::number(checkNum % 103).toInt());
 QString barstring = barstart + barbody + barcheck + barend;
 return barstring;
}

void printerCode(QString printername)
{
   QPrinter printer; 
 printer.setPrinterName(printername);
 QString printerName = printer.printerName();
 if(printerName.size() == 0)
 return;
 //生成条形码
QString outno = "100078984576";
 //调用画布
 QPainter infopainter(&printer);
 QPainter * painter = &infopainter;
 QRect viewrect = painter->viewport();
 qDebug()<<"rect size :"<<viewrect.width();
 qDebug()<<"rect size :"<<viewrect.height();
 painter->setRenderHint(QPainter::Antialiasing);
 painter->setRenderHint(QPainter::HighQualityAntialiasing);
 painter->setRenderHint(QPainter::TextAntialiasing);

 painter->setPen(QPen(QColor(0, 0, 0), 1));
 QFont font;
 font.setPointSize(8);
 font.setFamily("黑体");
 painter->setFont(font);
 int maxwidth = viewrect.width();
 int printposY = 35;
 QString barstring = getCode128CString(outno);
 qDebug()<<"bar string :"<<barstring;
 int LineWidth=1;
 int CODEWIDTH = LineWidth*barstring.size();
 int MAXHEIGHT=32;
 //计算条线宽度时,精度丢失造成条码右边空白,进行右移居中
 int diffmove=(maxwidth-CODEWIDTH)/2;
 QPen white,black;
 white.setColor(QColor(255,255,255));
 black.setColor(QColor(0,0,0));
 white.setWidthF(LineWidth);
 black.setWidthF(LineWidth);
 //画线
 for(int i=0;i<barstring.size();i++)
 {
 if(barstring.at(i)=='b')
 painter->setPen(black);
 else
 painter->setPen(white);
 painter->drawLine(i*LineWidth+LineWidth/2+diffmove,printposY,i*LineWidth+LineWidth/2+diffmove,printposY+MAXHEIGHT);
 }
 printposY += 32;
 painter->drawText(0,printposY,maxwidth,20,Qt::AlignCenter,outno);
painter->end();
}


#资料开发工程师##C++工程师#
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务