Qt之打印print源码分析

看别人的代码,确实是一个学习的过程。相信通过大量的源码的阅读和理解,以及项目经验的堆积,我会变得更加强大!

我要更加努力!!!才行!

(1).h文件

#ifndef __PRINT_H__
#define __RINT_H__
 
#include <windows.h>
#include <string>
#include <IOSTREAM>
#include <tchar.h>
#include <vector>
#include <qobject.h>
 
 
 
using namespace std;
 
//端口信息、并口信息
typedef struct DataInfo
{
 
 
 
    int printtype; //打印类型,0串口,1:usb,2:并口
 
    string com;  //串口端口号
    int BawdRate;//波特率
    int DataBits;  //数据位
    char Parity;  //校验位
    int ReceiveBuffer;  //缓冲区
    int StopBits;//停止位
 
    string lpt; //并口
    string usb;//usb名称
 
    string ip;
 
}PrintDevice;
 
//打印控制类
class print:public QObject
{
	Q_OBJECT
public:
    print();
    ~print();
    //载入数据com等
    bool start (int caozuo ,int type, QString com, QString bote,QString  lpt  ,  QString usb , QString ip , QString str);
 
public:
 
    bool InitPort();//初始化串口
    void InitializeDevicePar();  
	HANDLE hPort; //句柄
 
public:
    //输出打印
    bool NewRow();//换行打印
    bool NewRow(int iRow);//换N行打印
    bool CutPaper();//切纸
    bool OpenCashbox();//开钱箱
 
    bool   WriteData(string meg);  //写入数据
    bool   WriteData(string meg, int len);  //同上
 
    bool Lpt_writedata(string msg);
    bool Lpt_writedata(string msg, int len);
private:
    PrintDevice _device;
 
    int _caozuo; //0:打印   1:切纸  2:开钱箱
 
    QString  _print_text;
 
 
	bool  bk_flag; //并口是否能用, true能,false否
};
 
 
 
#endif


(2).cpp

//一行打印42字符

#include "Print.h"
#include <iostream>
#include <ctime>
#include <string>
#include <qmessagebox.h>
#include <qlibrary.h>
 
#include <qthread.h>
 
#include <qeventloop.h>
#include <QDebug>
 
using namespace std;
#include "qtcpserver.h"
 
print::print()
{
 
    hPort=NULL;  //句柄
 
}
bool print::start (int caozuo ,int type, QString com, QString bote,QString  lpt  ,  QString usb , QString ip , QString str)
{
 
    _caozuo = caozuo;
 
    _device.printtype = type;  //打印类型,0串口,1:usb,2:并口
 
 
    _device.com = com.toStdString(); //串口端口号
    _device.BawdRate = bote.toInt(); //波特率
    _device.DataBits=8;  //数据位
    _device.StopBits=ONESTOPBIT;  //停止位
    _device.Parity=NOPARITY;  //NONE  //校验位
    _device.ReceiveBuffer=256;  //缓冲区
 
    _device.lpt = lpt.toStdString(); //并口
    _device.usb = usb.toStdString(); //usb名称
 
    _device.ip = ip.toStdString();
 
 
    _print_text = str;
 
 
    //usb
    QLibrary mylib("./lg.dll");   //声明所用到的dll文件
    if (mylib.load())              //判断是否正确加载
    {
       qDebug()<<"DLL load is OK!";
       typedef QString (*Fun)(QString ); //定义函数指针,以备调用
       Fun open=(Fun)mylib.resolve("find_path");    //援引 add() 函数
       if (open)                  //是否成功连接上 add() 函数
        {
            qDebug()<<"Link to Function is OK!";
            QString usbstr = QString::fromStdString(_device.usb);
            usbstr = usbstr.toLower().section("usb",1,1);
            _device.usb = open(usbstr).toStdString();
        }
        else
         qDebug()<<"Linke to Function is not OK!!!!";
    }
    else
       qDebug()<<"DLL is not loaded!";
 
 
   if( InitPort() )  //初始化打印机端口
   {
       return false;
   }
    return true;
}
 
print::~print()
{
	WriteData("\x1b\x44\x00",3);
	CloseHandle(hPort);//关闭端口
}
 
 
//初始化串口
bool print::InitPort()
{
 
    const char *sLinkName = _device.com.c_str();  //_str()函数返回一个指向正规C字符串的指针
    switch ( _device.printtype ) {
    case 0://串
        sLinkName = _device.com.c_str();
        break;
    case 1://并
        sLinkName = _device.lpt.c_str();
        break;
    case 2://usb
        sLinkName=  _device.usb.c_str();
        break;
    default:
        sLinkName = _device.com.c_str();
        break;
    }
 
 
	WCHAR   wstr[MAX_PATH]={0}; 
    //MultiByteToWideChar是一种windows API 函数,该函数映射一个字符串到一个宽字符(unicode)的字符串。
	/* 函数原型:
	 * int MultiByteToWideChar(
       UINT CodePage,
       DWORD dwFlags,
       LPCSTR lpMultiByteStr,
       int cchMultiByte,
       LPWSTR lpWideCharStr,
       int cchWideChar
       );
   */
    MultiByteToWideChar(CP_ACP,   0,  sLinkName,  -1,   wstr,   sizeof(wstr));
 
    qDebug()<<"sLinkName"<<sLinkName;
 
    if(_device.printtype==1) //并口
    {
        hPort = CreateFile(wstr, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING,  FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
        //hPort =CreateFile(wstr, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    }
    else
    {
        hPort =CreateFile(wstr, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        /* CreateFile(wstr, GENERIC_READ | GENERIC_WRITE,
                            0, NULL, OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL, NULL );*/
    }
 
 
	if (hPort == INVALID_HANDLE_VALUE) 
    {
        QString error = QString("打开端口、串口、usb失败,%1,%2").arg(_device.printtype).arg(sLinkName) ;
        QMessageBox msgBox;
        msgBox.setText( error );
        msgBox.exec();
		return false;
	}
	else 
    {
        //设置端口缓冲
        SetupComm(hPort, 1024, 1024);
 
        // 设定通讯端口超时参数
        COMMTIMEOUTS tmouts;
        tmouts.ReadIntervalTimeout = 100;
        tmouts.ReadTotalTimeoutMultiplier = 100;
        tmouts.ReadTotalTimeoutConstant = 100;
        tmouts.WriteTotalTimeoutConstant = 100;
        tmouts.WriteTotalTimeoutMultiplier = 100;
        SetCommTimeouts(hPort, &tmouts);
 
        //设定通讯端口通讯参数
        DCB dcb;
        BOOL bol = TRUE;
 
        //dcb.DCBlength = sizeof(dcb);
        bol=GetCommState(hPort, &dcb);
        dcb.BaudRate = _device.BawdRate;
        dcb.ByteSize = _device.DataBits;
        dcb.StopBits = _device.StopBits;
        dcb.Parity = _device.Parity;
 
        bol = SetCommState(hPort, &dcb); //配置串口
        // 清除通讯端口缓存
        PurgeComm(hPort, PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_RXABORT);
 
        // 初始化重叠IO对象
        OVERLAPPED m_OverlappedRead;
        OVERLAPPED m_OverlappedWrite;
        HANDLE m_hStopCommEvent;
        HANDLE m_hDataReady;
        memset(&m_OverlappedRead, 0, sizeof(OVERLAPPED));
        m_OverlappedRead.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        memset(&m_OverlappedWrite, 0, sizeof(OVERLAPPED));
        m_OverlappedWrite.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
 
        // 初始化事件对豿
        m_hStopCommEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        m_hDataReady = CreateEvent(NULL, FALSE, FALSE, NULL);
 
        if(_device.printtype == 1)//并口
        {
            //初始化打印ESC @
            DWORD iBytesLength;
            char chInitCode[] = "\x0D\x1B\x40";
 
			bk_flag = true;
 
            if( !Lpt_writedata(chInitCode, 3) )
            {
                qDebug()<<"并口打印机未开";
            }
        }
        else if(_device.printtype == 2)
        {
            //初始化打印ESC @
            DWORD iBytesLength;
            char chInitCode[] = "\x0D\x1B\x40";
            if( !WriteFile(hPort, chInitCode, (DWORD)3L, &iBytesLength, NULL) )
            {
                qDebug()<<"usb打印机未开";
            }
        }
        else //串口
        {
            //初始化打印ESC @
            DWORD iBytesLength;
            char chInitCode[] = "\x0D\x1B\x40";
            WriteFile(hPort, chInitCode, (DWORD)3L, &iBytesLength, NULL);
 
        }
	}
 
	return 0;
 
}
 
 
bool print::NewRow()
{
    std::string temp = "\x0A";
    return WriteData(temp);
}
 
//创建*排
bool print::NewRow(int iRow)
{
    bool Result = false;
    for (int i = 0; i < iRow; i++)
    {
        Result = NewRow();
        if (!Result) break;
    }
    return Result;
}
 
//切纸
bool print::CutPaper()
{
 
    char temp[] = { 0x1d, 0x56, 0x01  };
     bool r = WriteData(temp, 3);
    return r;
}
 
//打开钱盒(即超市所见找零钱抽屉)
bool print::OpenCashbox(){
 
    string s = "\x1B\x70\x30\x32\xC8";
    return WriteData(s);
}
 
 
bool   print::WriteData(string meg)
{
    bool ww = true;
    int type = _device.printtype;
    DWORD dwWrite;
    switch(type)
    {
    case 0://串
        ww = WriteFile(hPort, meg.c_str(), (DWORD)meg.length(), &dwWrite, NULL);
        break;
    case 2://usb
        ww = WriteFile(hPort, meg.c_str(), (DWORD)meg.length(), &dwWrite, NULL);
        break;
    case 1://并口
        ww = Lpt_writedata(meg);
        //qDebug()<<"enter 11111111111111111";
        //ww = WriteFile(hPort, meg.c_str(), (DWORD)meg.length(), &dwWrite, NULL);
        break;
    default://默认串口
        ww = WriteFile(hPort, meg.c_str(), (DWORD)meg.length(), &dwWrite, NULL);
        break;
    }
 
    return ww;
}
bool   print::WriteData(string meg, int len)
{
    bool ww = true;
    int type = _device.printtype;
    DWORD dwWrite;
    switch (type) {
    case 0://串
        ww = WriteFile(hPort, meg.c_str(), (DWORD)len, &dwWrite, NULL);
        break;
    case 2://usb
        ww = WriteFile(hPort, meg.c_str(), (DWORD)len, &dwWrite, NULL);
        break;
    case 1://并口
        ww = Lpt_writedata(meg, len);
        //ww = WriteFile(hPort, meg.c_str(), (DWORD)len, &dwWrite, NULL);
        break;
    default://默认串口
 
        ww = WriteFile(hPort, meg.c_str(), (DWORD)len, &dwWrite, NULL);
        break;
    }
 
    return ww;
 
}
 
 
bool print::Lpt_writedata(string msg)
{
 
 
 
    bool ret = false;
    if( !bk_flag)
    {
	return ret;
    }
    OVERLAPPED ov;
    memset(&ov,0,sizeof(ov));
    ov.hEvent = CreateEvent( 0,true,0,0);
    DWORD dwBytesWritten = 0;
    try
    {
        int iRet = WriteFile (hPort, msg.c_str(), (DWORD)msg.length(), &dwBytesWritten  ,&ov);
        //m_hFile文件句柄,m_buf缓冲区,m_len长度
 
        DWORD dw = WaitForSingleObject(ov.hEvent ,1000);
	int a = 10;
        if(dw!=0)
        {
	    bk_flag = false;
        }
        else
        {
            bk_flag = true;
            ret = true;
        }
    }
    catch(char *str)
    {
       ret = false;
    }
 
    CloseHandle(ov.hEvent);
 
    return ret;
}
 
bool print::Lpt_writedata(string msg, int len)
{
    bool ret = false;
 
	if( !bk_flag)
	{
		return ret;
	}
 
    OVERLAPPED ov;
    memset(&ov,0,sizeof(ov));
    ov.hEvent = CreateEvent( 0,true,0,0);
    DWORD dwBytesWritten = 0;
    try
    {
        int iRet = WriteFile (hPort, msg.c_str(), (DWORD)len, &dwBytesWritten  ,&ov);
        //m_hFile文件句柄,m_buf缓冲区,m_len长度
 
        DWORD dw = WaitForSingleObject(ov.hEvent ,1000);
	int a = 10;
        if(dw!=0)
        {
		bk_flag = false;
        }
        else
        {
		bk_flag = true;
                ret = true;
        }
    }
    catch(char *str)
    {
       ret = false;
    }
 
    CloseHandle(ov.hEvent);
 
    return ret;
}
 




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt5标签打印软件是基于Qt5框架开发的一款标签打印工具。Qt是一个跨平台的C++应用程序开发框架,具有强大的功能和丰富的库。标签打印软件的源码包含了使用Qt5框架实现的各种功能和界面设计,提供了简单易用的界面,方便用户进行标签的设计和打印操作。 标签打印软件源码的主要组成部分包括界面设计、数据处理、打印功能等。界面设计方面,源码提供了一些基本的控件和布局,用户可以根据自己的需求进行界面的定制和美化。 数据处理方面,源码提供了读取数据、解析数据、生成打印数据等功能。用户可以将需要打印的数据导入到软件中,通过源码提供的函数进行处理,生成可以打印的数据。 打印功能方面,源码封装了Qt中的打印类,提供了打印预览、设置打印参数、选择打印机等功能。用户可以通过软件界面设置打印的参数和打印机,然后通过源码中的函数调用实现打印操作。 除了以上功能,标签打印软件源码还可以根据用户的需求进行扩展和定制。用户可以根据自己的需求添加更多的功能,比如添加条形码、图片、文本等元素,实现更加丰富多样的标签打印。 总之,Qt5标签打印软件源码提供了一个基于Qt5框架的标签打印解决方案,用户可以通过源码进行二次开发和定制,满足不同的标签打印需求。 ### 回答2: Qt5 标签打印软件源码通常包含了用于创建标签和进行打印操作的代码。下面是一个简单的示例: ```cpp #include <QtWidgets> #include <QPrinter> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个窗口 QWidget window; // 创建一个布局 QVBoxLayout layout(&window); // 创建一个文本框用于输入标签内容 QLineEdit labelInput; layout.addWidget(&labelInput); // 创建一个按钮用于触发打印操作 QPushButton printButton("打印"); layout.addWidget(&printButton); // 当按钮被点击时,执行打印操作 QObject::connect(&printButton, &QPushButton::clicked, [&](){ // 创建一个打印机对象 QPrinter printer; // 创建一个打印对话框,用于选择打印机和设置打印参数 QPrintDialog dialog(&printer); // 如果对话框成功打开,并且用户点击了打印按钮 if (dialog.exec() == QDialog::Accepted) { // 创建一个绘图对象 QPainter painter(&printer); // 设置绘图的字体和大小 QFont font("Arial", 12); painter.setFont(font); // 获取文本框的内容,并绘制到打印机上 QString labelText = labelInput.text(); painter.drawText(100, 100, labelText); // 完成打印操作 painter.end(); } }); // 显示窗口 window.show(); // 运行应用程序 return app.exec(); } ``` 这段源码使用 Qt5 框架创建了一个简单的标签打印软件。它包含一个窗口,一个文本框用于输入标签内容,一个按钮用于触发打印操作。当用户点击打印按钮时,会弹出一个打印对话框,用户可以选择打印机和设置打印参数。然后,程序会将标签内容绘制到打印机上进行打印。希望对你有帮助! ### 回答3: Qt5是一种跨平台的应用程序开发框架,可以用于开发各种类型的软件,包括标签打印软件。标签打印软件通常用于在标签纸上打印文字、条形码或二维码等信息。 要开发一个标签打印软件,我们可以使用Qt5提供的各种功能和类来实现。首先,我们可以使用Qt的绘图功能来创建标签的布局,设置文字样式和位置,并绘制条形码或二维码。接下来,我们可以使用Qt打印功能将标签显示在打印机上,并控制打印机的设置,如打印纸张大小、打印质量等。 为了实现标签打印软件的功能,我们需要编写一些源代码。以下是一个简单的示例: ```cpp #include <QtWidgets> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个窗口 QWidget window; window.setWindowTitle("标签打印软件"); // 创建一个标签 QLabel label(&window); label.setText("这是一个标签"); label.setAlignment(Qt::AlignCenter); // 创建一个布局管理器 QVBoxLayout layout(&window); layout.addWidget(&label); // 创建一个打印按钮 QPushButton printButton("打印", &window); QObject::connect(&printButton, &QPushButton::clicked, [&]() { // 创建一个打印机对象 QPrinter printer; // 设置打印机的纸张大小和打印质量 printer.setPageSize(QPrinter::A4); printer.setResolution(QPrinter::HighResolution); // 创建一个打印对话框 QPrintDialog printDialog(&printer, &window); // 如果用户确认打印,则进行打印操作 if (printDialog.exec() == QDialog::Accepted) { // 创建一个绘图对象 QPainter painter; painter.begin(&printer); // 在标签纸上绘制标签信息 painter.drawText(QRect(0, 0, printer.width(), printer.height()), Qt::AlignCenter, label.text()); // 结束绘图 painter.end(); } }); // 将按钮添加到布局中 layout.addWidget(&printButton); // 将布局应用到窗口上 window.setLayout(&layout); // 显示窗口 window.show(); // 运行应用程序 return app.exec(); } ``` 通过这个源代码的示例,我们可以创建一个简单的标签打印软件。当用户点击打印按钮时,程序将弹出一个打印对话框,用户可以在该对话框中选择打印机和打印设置,并确认打印。然后,程序将在选择的打印机上打印出标签上的文字信息。这个示例只是一个起点,开发者可以根据自己的需求进一步扩展和改进这个软件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值