通过直接调用BarTender软件提供的接口还是有一些功能上的欠缺,目前对条码打印机的操作有两种方式:
通过COM方式调用其提供的接口
通过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的对象操作
通过querySubObject方式获取到当前对象内的对象实例
m_formats = m_barTender->querySubObject("Formats"); //获取Appication下的Formats对象
通过dynamicCall方式调用对象的成员函数
m_formats->dynamicCall("Open(char *,bool, char *)", "TEST.BTW", false, ""); // 让Bartender打开TEST,BTW标签文件
通过property获取对象的成员变量
bool labelHeight = m_barTender->property("Visible") //获取Bartender的Application对象下的Visuble成员变量
通过setProperty设置对象的成员变量
m_barTender->setProperty("Visible",true); //设置Bartender的Application对象下的Visuble成员变量为true
具体的类及其成员可看Bartender的帮助文档