通过直接调用BarTender软件提供的接口还是有一些功能上的欠缺,目前对条码打印机的操作有两种方式:

  1. 通过COM方式调用其提供的接口

  2. 通过QTAPI(或WINAPI)提供的打印机接口来进行操作

1. QTAPI(或WINAPI)方式

QT的QPrinterInfo头文件中提供了对打印机的一些操作

需要在QT的.pro文件中加入如下代码

 QT += printsupport

1.1 获取所有打印机

 static QList<QPrinterInfo> QPrinterInfo::availablePrinters();

此函数为QPrinterInfo静态函数,无需参数

1.2 获取打印机名字和状态

需通过1.1中的获取打印机获取到某一个打印机的QPrinterInfo

 QPair<QPrinter::PrinterState,bool> BarTender::printerState(const QString &printerName)
 {
     auto printers = getPrinterInfo(); //通过1.1中的函数获取得到
     for(auto iter : printers)
     {
         if(iter.printerName().compare(printerName))
             return QPair<QPrinter::PrinterState,bool>(iter.state(),true);
     }
 ​
     return QPair<QPrinter::PrinterState,bool>(QPrinter::PrinterState::Error,false);
 }

QPrinter::PrinterState是一个enum枚举,内容如下:

 enum PrinterState { Idle        = 0,    //空闲
                     Active      = 1,    //活跃
                     Aborted     = 2,    //终止
                     Error       = 3 };  //错误

1.3 打开打印机首选项

Zebra打印机的首选项里面有很多功能可以设置

纸张大小

打印速度

偏移量

。。。。。

通过BarTender提供的COM接口很多窗口在QT中是打不开的,且QTAPI也没提供接口,所以需要通过WINAPI的方式打开

 void Widget::openPrinterPreferences(const QString& printerName,bool prop)
 {
     // 将打印机名称转换为 LPCWSTR 类型
     LPWSTR printerNameLPCWSTR = (LPWSTR)printerName.utf16();
 ​
     // 获取打印机的句柄
     HANDLE printerHandle;
     if (!OpenPrinter(const_cast<LPTSTR>(printerNameLPCWSTR), &printerHandle, NULL)) {
         qDebug() << "Failed to open printer:" << printerName;
         return;
     }
     long result;
     if(prop) {
         // 获取打印机的设备模式 true时打开的首选项,false时打开的是打印机属性
         DEVMODE devMode;
         ZeroMemory(&devMode, sizeof(DEVMODE));
         devMode.dmSize = sizeof(DEVMODE);
         devMode.dmDriverExtra = 0;
 ​
         result = ::DocumentProperties(NULL, printerHandle, printerNameLPCWSTR, &devMode, &devMode, DM_IN_PROMPT);
     }else {
         result = ::PrinterProperties(NULL, printerHandle);
     }
     if (result != IDOK) {
         qDebug() << "Failed to open printer preferences for:" << printerName;
     }
 ​
     // 关闭打印机句柄
     ClosePrinter(printerHandle);
 ​
 }

2. COM方式

BarTender提供了COM接口以助开发者通过其他语言调用此软件

需要在QT的.pro文件中加入如下代码

 QT += axcontainer

2.1 COM初始化

 HRESULT r = OleInitialize(0); // 多线程时,必须加
 HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
 m_barTender = new QAxObject("BarTender.Application"); // 连接 BarTender 控件

这样m_barTender就通过COM连上了BarTender的Application

2.2 BarTender的对象操作

  1. 通过querySubObject方式获取到当前对象内的对象实例

 m_formats = m_barTender->querySubObject("Formats"); //获取Appication下的Formats对象
  1. 通过dynamicCall方式调用对象的成员函数

 m_formats->dynamicCall("Open(char *,bool, char *)", "TEST.BTW", false, "");
 // 让Bartender打开TEST,BTW标签文件
  1. 通过property获取对象的成员变量

 bool labelHeight = m_barTender->property("Visible")
 //获取Bartender的Application对象下的Visuble成员变量
  1. 通过setProperty设置对象的成员变量

 m_barTender->setProperty("Visible",true);
 //设置Bartender的Application对象下的Visuble成员变量为true

具体的类及其成员可看Bartender的帮助文档