QT 驱动条码打印机(没有验证过)

这里的打印机是条码打印机,因为第一次接触这种设备,所以买了斑马的GK888t型条码打印机,据说ZPL语言就是斑马的杰作想必支持会好点。实际是,除了ZPL本身外,没有SDK,也没有DDK,所以,一切就只能靠搜索引擎帮忙了,这里感谢百度和谷歌啦。

写在开头:有些在网上找的内容忘了留网址,写该文时搜索相关内容补的网址,请原相关作者见谅。

粗略总结了6种方法,个人比较推荐第6第3种方法。如下:

1、直接打印(最简单)。
条码打印机可以当做普通打印机使用。所以,你用记事本、word等等只要有打印功能的,都可以打印。所以该方法就是使用Qt绘制图片、path什么的,然后打印即可。

2、把USB打印机映射到LPT端口。
参照:http://blog.sina.com.cn/s/blog_6d4dcdba0100xowi.html

这里我在本机不需要安装“Microsoft Loopback Adapter”,而是使用如下的方法:(gk888t是我共享的打印机名)
net use LPT2 \\127.0.0.1\gk888t

3、使用转意字符(需要ZPL语言,建议)。
参照:http://stackoverflow.com/questions/4442122/send-raw-zpl-to-zebra-printer-via-usb

一定要按上文方法设置转意字符。代码如下,不再阐述。QPrinter printer(QPrinter::PrinterResolution);
QPrintDialog *dlg = new QPrintDialog(&printer, this);if (dlg->exec() == QDialog::Accepted)
{QPainter p(&printer);p.drawText(0,0,"${^XA^FO10,100^BY3^BCN,100,Y,N,N^FDDC123456^FS^XZ}$");

…………
}

4、使用CUPs API(未完成)。
参照:http://stackoverflow.com/questions/5558248/qt-print-raw-text

粗试文中的方法,当时链接库没搞好,所以放弃了。

5、使用libusb-win32(可以)。
参照:http://sourceforge.net/apps/trac/libusb-win32/wiki
http://www.4ucode.com/Study/Topic/617136

特别声明:如果你和我一样是菜鸟,请注意,最好在试验该方法时在虚拟机内进行,不然,系统USB设备可能会统统罢工的。
参照testlibusb.c例程,这里贴一下打印的代码:别忘了在.pro文件添加
LIBS += ./libusb.a
这里我把libusb.a和源代码放在了一起,还有lusb0_usb.h头文件不要忘了,……udev = usb_open(dev);
if (udev)
{
char *sb = "^XA^FO10,100^BY3^BCN,100,Y,N,N^FDDAe123456^FS^XZ";
int ok = usb_claim_interface(udev,0);
printf("%d\n",ok);
ok = usb_bulk_write(udev,0x01,sb,50,1000);
printf("%d\n",ok);
…………但这里有个问题,一直没有搞定使用libusb同时又使用系统的打印机驱动模式,也就是说,在该模式下,无法使用打印服务访问打印机,不再支持直接打印。
这个不知是我的设置问题还是什么。折腾的时候发现,使用一种方法可以一起使用,但一旦系统重启就不再可以,同时,打印服务以及rpc服务均不正常,需要使用斑马自带的打印机安装程序重新安装,系统才能回复正常,但一重启依旧。

6、使用Win32 API打印原始数据(强烈建议)。
这可是微软的方法啊,不用在系统添加任何文件,同时又能保证打印机的正常使用,所以强烈建议。
参照:http://support.microsoft.com/kb/138594

在.pro文件添加
LIBS += D:\Qt\qtcreator-2.4.1\mingw\lib\libwinspool.a
注:我的mingw安装路径 D:\Qt\qtcreator-2.4.1\mingw。贴一段我用来试验该方法的源代码:
注意事项:qt creater是UNICODE环境,所以使用OpenPrinter等函数时会自动转为OpenPrinterW,这样就需要进行char到wchar的转换或者使用宏定义,请参看winspool.h的内容,觉得比较烦,所以就直接给它改成OpenPrinterA了(其它同)。

#include “widget.h”
#include “ui_widget.h”

#include
#include
#include
#include
#include <windows.h>
#include <winspool.h>
#include

BOOL RawDataToPrinter(LPSTR szPrinterName, LPBYTE lpData, DWORD dwCount);
bool RawDataToPrinter(QString printerName,QStringList *barcode);

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}

Widget::~Widget()
{
delete ui;
}

void Widget::on_pushButton_clicked()
{
QPrinter printer(QPrinter::PrinterResolution);
QPrintDialog *dlg = new QPrintDialog(&printer, this);

if (dlg->exec() == QDialog::Accepted)
{
QPainter p(&printer);
//p.drawText(0,0,“ X A F O 10 , 10 0 B Y 3 B C N , 100 , Y , N , N F D D C 12345 6 F S X Z {^XA^FO10,100^BY3^BCN,100,Y,N,N^FDDC123456^FS^XZ} XAFO10,100BY3BCN,100,Y,N,NFDDC123456FSXZ”);
//p.drawText(0,0,“ X A F O 10 , 10 0 B Y 3 B C N , 100 , Y , N , N F D C D 12345 6 F S X Z {^XA^FO10,100^BY3^BCN,100,Y,N,N^FDCD123456^FS^XZ} XAFO10,100BY3BCN,100,Y,N,NFDCD123456FSXZ”);

QString printerName = printer.printerName();
QString lpData = tr(“XAFO10,100BY3BCN,100,Y,N,NFDDD123456FS^XZ”);
long dwCount = lpData.length();

QStringList sl;
sl.append(tr(“XAFO10,100BY3BCN,100,Y,N,NFDAB123456FS^XZ”));
sl.append(tr(“XAFO10,100BY3BCN,100,Y,N,NFDCD123456FS^XZ”));
sl.append(tr(“XAFO10,100BY3BCN,100,Y,N,NFDEF123456FS^XZ”));
if(RawDataToPrinter(printerName,&sl)==true)
{
qDebug() << “OK”;
}else
{
qDebug() << “NO”;
}

/if(RawDataToPrinter((char)printerName.toLocal8Bit().data(),(unsigned char*)lpData.toLocal8Bit().data(),dwCount) == true)
{
qDebug() << “OK”;
}else
{
qDebug() << “NO”;
}*/
}
delete dlg;
}

BOOL RawDataToPrinter(LPSTR szPrinterName, LPBYTE lpData, DWORD dwCount)
{
HANDLE hPrinter;
DOC_INFO_1A DocInfo;
DWORD dwJob;
DWORD dwBytesWritten;

// Need a handle to the printer.
if(!OpenPrinterA(szPrinterName,&hPrinter,NULL))
{
return FALSE;
}

// Fill in the structure with info about this “document.”
DocInfo.pDocName = “BarCode”;
DocInfo.pOutputFile = NULL;
DocInfo.pDatatype = “RAW”;

// Inform the spooler the document is beginning.
if((dwJob = StartDocPrinterA(hPrinter,1,(PBYTE)&DocInfo)) == 0)
{
ClosePrinter(hPrinter);
return FALSE;
}

// Start a page.
if(!StartPagePrinter(hPrinter))
{
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return FALSE;
}

// Send the data to the printer.
if(!WritePrinter(hPrinter,lpData,dwCount,&dwBytesWritten))
{
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return FALSE;
}

if(!WritePrinter(hPrinter,lpData,dwCount,&dwBytesWritten))
{
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return FALSE;
}

// End the page.
if(!EndPagePrinter(hPrinter))
{
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return FALSE;
}

// Inform the spooler that the document is ending.
if(!EndDocPrinter(hPrinter))
{
ClosePrinter(hPrinter);
return FALSE;
}

// Tidy up the printer handle.
ClosePrinter(hPrinter);

// Check to see if correct number of bytes were written.
if(dwBytesWritten != dwCount)
{
QMessageBox::warning(0,QObject::tr(“打印”),QObject::tr(“打印输出数据与输入数据大小不相符”),QObject::tr(“确定(&E)”));
return FALSE;
}else
{
return TRUE;
}
}

bool RawDataToPrinter(QString printerName, QStringList *barcode)
{
HANDLE hPrinter;
DOC_INFO_1A DocInfo;
DWORD dwJob;
DWORD dwBytesWritten;
LPSTR szPrinterName;
long dwCount;

if(!(barcode->length() >0))
{
return false;
}

szPrinterName = (char*)printerName.toLocal8Bit().data();

//获取打印机的handle
if(!OpenPrinterA(szPrinterName,&hPrinter,NULL))
{
return false;
}

//填充打印文档的DOC_INFO_1A
DocInfo.pDocName = “BarCode”;
DocInfo.pOutputFile = NULL;
DocInfo.pDatatype = “RAW”;

//通知打印服务,准备开始打印文档
if((dwJob = StartDocPrinterA(hPrinter,1,(PBYTE)&DocInfo)) == 0)
{
ClosePrinter(hPrinter);
return false;
}

//开始一页的打印
if(!StartPagePrinter(hPrinter))
{
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return false;
}

foreach(QString str,*barcode)
{
//发送数据到打印机
dwCount = str.toLocal8Bit().length();
if(!WritePrinter(hPrinter,(unsigned char *)str.toLocal8Bit().data(),dwCount,&dwBytesWritten))
{
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return false;
}
//检查实际写入数据是否与原始数据大小相符
if(dwBytesWritten != dwCount)
{
QMessageBox::warning(0,QObject::tr(“打印”),QObject::tr(“打印输出数据与输入数据大小不相符”),QObject::tr(“确定(&E)”));
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return false;
}
}

//结束一页的打印
if(!EndPagePrinter(hPrinter))
{
EndDocPrinter(hPrinter);
ClosePrinter(hPrinter);
return FALSE;
}

//通知打印服务,文档打印结束
if(!EndDocPrinter(hPrinter))
{
ClosePrinter(hPrinter);
return FALSE;
}

//收回handle
ClosePrinter(hPrinter);
return true;
}

以上即我当前所能使用的方法,希望能给大家带来帮助,如有不到之处希望当家指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/23608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《OWASP代码审计》学习——注入漏洞审计

一、注入的概念 注入攻击允许恶意用户向应用程序添加或注入内容和命令&#xff0c;以修改其行为。这些类型的攻击是常见且广泛的&#xff0c;黑客很容易测试网站是否易受攻击&#xff0c;攻击者也很容易利用这些攻击。如今&#xff0c;它们在尚未更新的遗留应用程序中非常常见…

Webpack5新手入门简单配置

1.初始化项目 yarn init -y 2.安装依赖 yarn add -D webpack5.75.0 webpack-cli5.0.0 3.新建index.js 说明&#xff1a;写入下面的一句话 console.log("hello webpack"); 4.执行命令 说明&#xff1a;如果没有安装webpack脚手架就不能执行yarn webpack&#xff08…

Docker dockerfile 案例:centos 支持 vim

创建一个 centos 容器&#xff0c;容器内默认是不支持使用 vim 指令的&#xff0c;只能使用 vi 指令。&#xff08;附&#xff1a;Dockerfile 语法与指令&#xff09; 但想在创建 centos 容器后就支持 vim 指令&#xff0c;需要自定义 centos&#xff0c;编写 dockerfile&…

h5浏览pdf文件

将hybrid整个复制到一级文件夹下 hybrid地址&#xff1a;https://download.csdn.net/download/qq_37194189/88157330 创建一个 pdf页面用于展示pdf文件 <template><view style"width: 100%;" ><web-view :src"pdfUrl"></web-view&…

P1064 [NOIP2006 提高组] 金明的预算方案 (依赖背包问题)(内附封面)

[NOIP2006 提高组] 金明的预算方案 题目描述 金明今天很开心&#xff0c;家里购置的新房就要领钥匙了&#xff0c;新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是&#xff0c;妈妈昨天对他说&#xff1a;“你的房间需要购买哪些物品&#xff0c;怎么布置&#xff0…

python 连接oracle pandas以简化excel的编写和数据操作

python代码 Author: liukai 2810248865qq.com Date: 2022-08-18 04:28:52 LastEditors: liukai 2810248865qq.com LastEditTime: 2023-07-06 22:12:56 FilePath: \PythonProject02\pandas以简化excel的编写和数据操作.py Description: 这是默认设置,请设置customMade, 打开koro…

Laravel 框架安装路由和控制器 ①

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; THINK PHP &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

启动Flink显示初始化状态怎么解决?

启动Flink显示初始化状态怎么解决&#xff1f; Flink On Yarn模式 问题 flnk任务在跑的过程中&#xff0c; 有时候任务停掉了 &#xff0c;不过我有 定时任务&#xff0c;可以把失败的flink任务拉起来&#xff0c;但是因为最新的checkpoint做失败了&#xff0c;导致脚本无法拉…

mysql报错:name ‘_mysql‘ is not defined

原因是&#xff1a; Mysqldb 不兼容 python3.5 以后的版本 解决办法&#xff1a; 使用pymysql代替MySQLdb 在项目应用下的__init__.py 添加上去 import pymysqlpymysql.version_info (1, 4, 13, "final", 0) pymysql.install_as_MySQLdb()

ChatGPT即将取代程序员

W...Y的主页 相信ChatGPT大家已经都不陌生&#xff0c;我们经常会在工作和学习中应用。但是ChatGPT的发展速度飞快。功能也越来越全面。ChatGPT的文章也是层次不穷的出现&#xff0c;ChatGPT即将取代程序员的消息也铺天盖地。那ChatGPT真的会取代程序员吗&#xff1f;我们是否…

HDFS中的Federation联邦机制

HDFS中的Federation联邦机制 当前HDFS体系架构--简介局限性 联邦Federation架构简介好处配置示例 当前HDFS体系架构–简介 当前的HDFS结构有两个主要的层&#xff1a; 命名空间&#xff08;namespace&#xff09; 由文件&#xff0c;块和目录组成的统一抽象的目录树结构。由n…

300个智商测试FLASH智商游戏ACCESS数据库

最近在找IQ测试方面的数据&#xff0c;网上大多只留传着33道题这种类型&#xff0c;其他的又因各种条件&#xff08;比如图片含水印等&#xff09;不能弄&#xff0c;这是从测智网下载的一些测试智商的游戏数据&#xff0c;游戏文件是FLASH的&#xff0c;扩展名是SWF。 数据包总…

机器学习笔记之优化算法(七)线搜索方法(步长角度;非精确搜索;Wolfe Condition)

机器学习笔记之优化算法——线搜索方法[步长角度&#xff0c;非精确搜索&#xff0c;Wolfe Condition] 引言回顾&#xff1a; Armijo \text{Armijo} Armijo准则及其弊端 Glodstein \text{Glodstein} Glodstein准则及其弊端 Wolfe Condition \text{Wolfe Condition} Wolfe Condi…

linux安装nodejs和vue

下载nodejs 打开 下载地址页面中下载**Linux Binaries (x64)**的二进制包设置安装目录 sudo mkdir -p /usr/local/lib/nodejs # 解压 如下载的 node-v18.17.0-linux-x64.tar.xz sudo tar -xJvf node-v18.17.0-linux-x64.tar.xz -C /usr/local/lib/nodejs 加入到PATH #######…

在excel中整理sql语句

数据准备 CREATE TABLE t_test (id varchar(32) NOT NULL,title varchar(255) DEFAULT NULL,date datetime DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO t_test VALUES (87896cf20b5a4043b841351c2fd9271f,张三1,2023/6/8 14:06); INSERT INTO t_test …

LLM微调 | Prefix-Tuning, Prompt-Tuning, P-tuning, P-tuning-v2

🔥 下面我只是分析讲解下这些方法的原理以及具体代码是怎么实现的,不对效果进行评价,毕竟不同任务不同数据集效果差别还是挺大的。 文章目录 0、hard prompt & soft prompt区别1、Prefix-Tuning2、Prompt-Tuning3、P-tuning4、P-tuning-v25、来看看adapter,lora,pref…

Python 程序设计入门(009)—— 元组的操作

Python 程序设计入门&#xff08;009&#xff09;—— 元组的操作 目录 Python 程序设计入门&#xff08;009&#xff09;—— 元组的操作一、元组和列表的区别二、创建元组1、使用赋值语句创建元组2、使用 tuple() 函数创建元组 三、访问元组中的元素1、使用索引访问元组的元素…

Maven可选依赖和排除依赖简单使用

可选依赖 可选依赖指对外隐藏当前所依赖的资源 在maven_04_dao的pom.xml,在引入maven_03_pojo的时候&#xff0c;添加optional <dependency><groupId>com.rqz</groupId><artifactId>maven_03_pojo</artifactId><version>1.0-SNAPSHOT&…

无涯教程-Perl - Subroutines(子例程)

定义子程序 Perl编程语言中 Subroutine子程序定义的一般形式如下: sub subroutine_name {body of the subroutine } 调用该Perl Subroutine的典型方式如下- subroutine_name( list of arguments ); 在Perl 5.0之前的版本中&#xff0c;调用 Subroutine的语法略有不同&…

设计模式之模板方法

一、概述 定义一个操作中的算法的骨架&#xff0c;将一些步骤延迟到子类中。 TemplateMethod使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 二、适用性 1.一次性实现一个算法的不变的部分&#xff0c;并将可变的行为留给子类来实现。 2.各子类中公共…