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();
}