QT使用Win32 API与斑马打印机通信需要库libwinspool.a,这个库一般在Qt安装后就有了,需要去Qt的安装目录去找。复制一份放在自己的工程目录下,然后在Qt的项目右击出现菜单,点击【添加库】导入这个库就行了。
我安装的Qt,存在libwinspool.a的路径是Qt/Qt5.8.0/Tools/mingw530_32/i686-w64-mingw32/lib/libwinspool.a。
获取libwinspool.a
链接:https://pan.baidu.com/s/1-2j0-CqnMn4sKYTp-Fitcw
提取码:r2ny
库导入完毕后,请看以下2篇官方文档,我根据官方文档做了下修改,完成了PC程序与斑马打印机的通信。
(2)https://docs.microsoft.com/en-us/windows/win32/printdocs/sending-data-directly-to-a-printer
代码如下
1 /** 2 * @brief Print::RawDataToPrinter 3 * 发送ZPL指令直接与打印机通信 4 * @param szPrinterName 打印机名称 5 * @param lpData ZPL指令 6 * @param dwCount 7 * @return ZPL指令发送成功,返回true,ZPL指令发送失败,返回false 8 */ 9 bool RawDataToPrinter(LPSTR szPrinterName, LPBYTE lpData, DWORD dwCount) 10 { 11 bool bStatus = FALSE; 12 HANDLE hPrinter = NULL; 13 DOC_INFO_1A DocInfo; 14 DWORD dwJob = 0L; 15 DWORD dwBytesWritten = 0L; 16 17 // 打开打印机的手柄,这里使用OpenPrinterA()而不是OpenPrinter()是因为当前Qt编码是ANSI 18 bStatus = OpenPrinterA(szPrinterName, &hPrinter, NULL); 19 if (bStatus) 20 { 21 // 填写打印文档信息 22 DocInfo.pDocName = (LPSTR)"Raw Document"; 23 DocInfo.pOutputFile = NULL; 24 DocInfo.pDatatype = (LPSTR)"RAW"; 25 26 27 // 通知后台处理程序文档正在开始 28 dwJob = StartDocPrinterA(hPrinter, 1, (LPBYTE)&DocInfo); 29 if (dwJob > 0) 30 { 31 // 开始一页的打印 32 bStatus = StartPagePrinter(hPrinter); 33 if (bStatus) 34 { 35 // 发送数据到打印机 36 bStatus = WritePrinter(hPrinter, lpData, dwCount, &dwBytesWritten); 37 EndPagePrinter (hPrinter); 38 } 39 // 通知后台处理程序文档正在结束 40 EndDocPrinter(hPrinter); 41 } 42 // 关闭打印机手柄 43 ClosePrinter(hPrinter); 44 } 45 // 检查是否写入了正确的字节数 46 if (!bStatus || (dwBytesWritten != dwCount)) 47 { 48 bStatus = false; 49 } 50 else 51 { 52 bStatus = true; 53 } 54 return bStatus; 55 }
1 bool Print() 2 { 3 QString cmd = tr("^XA^FO50,50^ADN,30,20^FD chen^FS^XZ"); 4 int length = cmd.length(); 5 QString printerName = QPrinterInfo::defaultPrinterName(); 6 bool ret = RawDataToPrinter((LPSTR)printerName.toLocal8Bit().data(), 7 (LPBYTE)cmd.toLocal8Bit().data(), (DWORD)length); 8 return ret; 9 }