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 }