Прилетела на днях сия игрушка.
Применений к ней куча — всё зависит от фантазии.
Сейчас расскажу как на нём печатать из Qt.
Первым делом идём на сайт производителя за дровами, да не простыми, а OPOS.
Вставим чековую ленту в принтер, теперь вынимаем питание, зажимаем верхнюю кнопку (Line feed), включаем питание, ждём пока зажужжит и отпускаем кнопку.
Напечатаются настройки и жмём снова верхнюю кнопку (Line feed) что бы принтер выплюнул ленту.
С ленты нас интересует только параметры RS232, они сейчас потребуются.
Запускаем установку дров, указываем способ соединения и параметры скорости (по умолчанию 19200) и прочие, при необходимости.
Для теста, запускаем OPOS POS Printer configurator и настраиваем параметры.
В нём мы настраиваем как связатсья с принтером через OPOS драйвер. Запомните device name — оно нам пригодится.
Потом запускаем OPOS POS Printer test и можно немного поиграться.
Если всё работает, то пора создавать новый Qt проект (тип — на ваш выбор).
Всё общение с термопринтером идёт через ActiveX компонент OPOSPOSPrinter.ocx, поэтому сейчас заодно покажу как работать с ActiveX в Qt.
Для работы нам нужно получить от библиотеки реализацию cpp и h файлов с помощью утилитки, входящую в состав Qt — dumpcpp.
Открываем виндузятную консольку, переходим в каталог, где будем создавать классы, и запускаем dumpcpp:
cd C:\Projects\1CTerminal\1CTerminal\opos dumpcpp "C:\Program Files (x86)\OLEForRetail\ServiceOPOS\POSPrinter\CustomEngineering\OPOSPOSPrinter.ocx"
В каталоге должно появится два файла, открываем их на изучение, что бы примерно понять с чего начать.
Т.е. как минимум узнаём пространство имён (OposPOSPrinter_1_9_Lib) и название класса (OPOSPOSPrinter).
В *.pro файле проекта добавляем:
CONFIG += qaxcontainer # Для работы с ActiveX
Добавляем в проект сгенерированные файлы oposposprinter_1_9_lib.cpp и oposposprinter_1_9_lib.h
Заодно добавьте следующий заголовочный файл, в нём собрал все используемые статусные сообщения:
//-- Коды результата
namespace OposPOSPrinter_1_9_Lib {
#define OPOS_SUCCESS 0
#define OPOS_E_CLOSED 101
#define OPOS_E_CLAIMED 102
#define OPOS_E_NOTCLAIMED 103
#define OPOS_E_NOSERVICE 104
#define OPOS_E_DISABLED 105
#define OPOS_E_ILLEGAL 106
#define OPOS_E_NOHARDWARE 107
#define OPOS_E_OFFLINE 108
#define OPOS_E_NOEXIST 109
#define OPOS_E_EXISTS 110
#define OPOS_E_FAILURE 111
#define OPOS_E_TIMEOUT 112
#define OPOS_E_BUSY 113
#define OPOS_E_EXTENDED 114
#define strOPOS_SUCCESS "OPOS_SUCCESS"
#define strOPOS_E_CLOSED "OPOS_E_CLOSED"
#define strOPOS_E_CLAIMED "OPOS_E_CLAIMED"
#define strOPOS_E_NOTCLAIMED "OPOS_E_NOTCLAIMED"
#define strOPOS_E_NOSERVICE "OPOS_E_NOSERVICE"
#define strOPOS_E_DISABLED "OPOS_E_DISABLED"
#define strOPOS_E_ILLEGAL "OPOS_E_ILLEGAL"
#define strOPOS_E_NOHARDWARE "OPOS_E_NOHARDWARE"
#define strOPOS_E_OFFLINE "OPOS_E_OFFLINE"
#define strOPOS_E_NOEXIST "OPOS_E_NOEXISTS"
#define strOPOS_E_EXISTS "OPOS_E_EXISTS"
#define strOPOS_E_FAILURE "OPOS_E_FAILURE"
#define strOPOS_E_TIMEOUT "OPOS_E_TIMEOUT"
#define strOPOS_E_BUSY "OPOS_E_BUSY"
#define strOPOS_E_EXTENDED "OPOS_E_EXTENDED"
//-- Коды состояний
#define PTR_S_RECEIPT 2
//-- Коды параметров
#define PTR_SUE_COVER_OPEN 11
#define PTR_SUE_COVER_OK 12
#define PTR_SUE_JRN_EMPTY 21
#define PTR_SUE_JRN_NEAREMPTY 22
#define PTR_SUE_JRN_PAPEROK 23
#define PTR_SUE_REC_EMPTY 24
#define PTR_SUE_REC_NEAREMPTY 25
#define PTR_SUE_REC_PAPEROK 26
#define PTR_SUE_SLP_EMPTY 27
#define PTR_SUE_SLP_NEAREMPTY 28
#define PTR_SUE_SLP_PAPEROK 29
#define PTR_SUE_JRN_CARTRIDGE_EMPTY 41
#define PTR_SUE_JRN_CARTRIDGE_NEAREMPTY 42
#define PTR_SUE_JRN_HEAD_CLEANING 43
#define PTR_SUE_JRN_CARTRIDGE_OK 44
#define PTR_SUE_REC_CARTRIDGE_EMPTY 45
#define PTR_SUE_REC_CARTRIDGE_NEAREMPTY 46
#define PTR_SUE_REC_HEAD_CLEANING 47
#define PTR_SUE_REC_CARTRIDGE_OK 48
#define PTR_SUE_SLP_CARTRIDGE_EMPTY 49
#define PTR_SUE_SLP_CARTRIDGE_NEAREMPTY 50
#define PTR_SUE_SLP_HEAD_CLEANING 51
#define PTR_SUE_SLP_CARTRIDGE_OK 52
#define PTR_SUE_IDLE 1001
#define strPTR_SUE_COVER_OPEN "PTR_SUE_COVER_OPEN"
#define strPTR_SUE_COVER_OK "PTR_SUE_COVER_OK"
#define strPTR_SUE_REC_EMPTY "PTR_SUE_REC_EMPTY"
#define strPTR_SUE_REC_NEAREMPTY "PTR_SUE_REC_NEAREMPTY"
#define strPTR_SUE_REC_PAPEROK "PTR_SUE_REC_PAPEROK"
#define strPTR_SUE_IDLE "PTR_SUE_IDLE"
#define PTR_BM_ASIS -11
#define PTR_BM_CENTER -2
#define PTR_BCS_UPCA 101
#define PTR_BCS_UPCE 102
#define PTR_BCS_EAN128 120
#define PTR_BCS_Code128 110
#define PTR_BC_TEXT_ABOVE -12
#define PTR_BC_TEXT_BELOW -13
#define PTR_BC_CENTER -2
}
#endif // OPOSPRINTER_CONSTS_H
Так же создадим новый класс, например Printer, в котором будем осуществлять непосредственно печать.
Дальше я разбирался с помощью интуиции и примерного проекта (В основном: C:\Program Files (x86)\OLEForRetail\ServiceOPOS\POSPrinter\CustomEngineering\OPOSPOSPrinterTest_Src\FormMainApp.frm).
Printer.h:
#ifndef PRINTER_H
#define PRINTER_H
#include "opos/oposposprinter_1_9_lib.h"
#include "opos/oposprinter_consts.h"
using namespace OposPOSPrinter_1_9_Lib;
class Printer : public QObject
{
Q_OBJECT
public:
explicit Printer(QObject *parent = 0);
signals:
public slots:
private:
IOPOSPOSPrinter * oposPrinter;
};
#endif // PRINTER_H
и
#include "printer.h"
Printer::Printer(QObject *parent) :
QObject(parent)
{
oposPrinter = new IOPOSPOSPrinter();
oposPrinter->setControl("{ccb90152-b81e-11d2-ab74-0040054c3719}");
int res = oposPrinter->Open("Custom POS Printer");
qDebug()<<"Open sataus: "<<res;
oposPrinter->ClaimDevice(100);
oposPrinter->SetDeviceEnabled(true);
oposPrinter->PrintImmediate(2, "Hello, QT!, Привет, мир!" );
oposPrinter->CutPaper(100);
oposPrinter->Close();
}
Надеюсь, запечатает. На этом всё =)
Архивчик со вспомогательным классом: Printer
В printer.cpp заменить AppSettings()->value(«com_printer»).toString() на device name из OPOS POS Printer configurator.
Навсякий случай дрова OPOS для Custom VKP-80II
1 comment