qt实现小票打印

1.需求

需要实现订单结算后的小票打印,要求能打印商品数据和结算数据及将小票号打印成条码,退货或查询时能通过扫描枪扫描条码快速查询到订单信息

2.解决

1.通过将数据转化为html后调用qt进行打印,打印机无法打印img标签中的条码

2.通过将数据转化为html,将条码直接绘制的方法实现了需求

3.代码

Barcode.h

// Barcode.h: interface for the CBarcode class.
//
//  Copyright 2002 Neil Van Eps
//
//////////////////////////////////////////////////////////////////////
#ifndef BARCODE_H
#define BARCODE_H
#include <QString>
#include <QPainter>

// bblib.h
//  must put build number define on third line
#define BUILDNUM 7
//
//
//  Copyright 2002 Neil Van Eps
//

enum Symbology
{
    RATIONALCODABAR,
    TRADITIONALCODABAR,
    I2OF5,
    CODE39,
    COD128,
    UPCEAN,
    CODE93
};

#define     COLORWHITE  0x00FFFFFF
#define     COLORBLACK  0x00000000

class CBarcode
{
public:
    CBarcode();
    void    LoadData(QString csMessage, const QString &strImagePath, double dNarrowBar, double dFinalHeight, int nStartingXPixel, int nStartingYPixel, double dRatio = 1.0);
    virtual void DrawBitmap(QPainter *painter = nullptr) = 0;
    //virtual void BitmapToClipboard() = 0;
    virtual ~CBarcode();
    long    GetBarcodePixelWidth();
    long    GetBarcodePixelHeight();
protected:
    QString m_csMessage;
    //HDC       m_hDC;
    QString m_strImagePath;
    long    m_nFinalBarcodePixelWidth;
    long    m_nNarrowBarPixelWidth;
    long    m_nPixelHeight;
    long    m_nStartingXPixel;
    long    m_nStartingYPixel;
    long    m_nSymbology;
    long    m_nWideBarPixelWidth;
    virtual void DrawPattern(QString csPattern, QPainter *painter) = 0;
};

#endif // !defined(AFX_BARCODE_H__C5D7FCDA_5C8F_4244_AF95_33D6FA93F8EB__INCLUDED_)

Barcode.cpp

// Barcode.cpp: implementation of the CBarcode class.
//
//  Copyright 2002 Neil Van Eps
//
//////////////////////////////////////////////////////////////////////
#include "Barcode.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CBarcode::CBarcode()
{

}

CBarcode::~CBarcode()
{

}

////////////////////////////////////////////////////////////////////////////////////
//
//  Name:
//      LoadData()
//
//  Description:
//
//
//  Arguments:
//
//
//  Return:
//
//
//  Called by:
//
//
////////////////////////////////////////////////////////////////////////////////////
void CBarcode::LoadData(QString csMessage, const QString &strImagePath, double dNarrowBar, double dFinalHeight, int nStartingXPixel, int nStartingYPixel, double dRatio)
{
    int     i, nXAxisDpi, nYAxisDpi, nTemp;
    char    c;

    // values that can be saved without translation
    m_csMessage = csMessage;
    m_nStartingXPixel = nStartingXPixel;//nStartingXPixel*10;
    m_nStartingYPixel = nStartingYPixel;//nStartingYPixel*10;
    //m_hDC = pDC;
    m_strImagePath = strImagePath;

    // load the final attributes that depend on the device context
    m_nPixelHeight = (int)dFinalHeight;//(int)((10*dFinalHeight) + 0.5);
    m_nNarrowBarPixelWidth = (int)(dNarrowBar + 0.5);
    m_nWideBarPixelWidth = (int)(dRatio*m_nNarrowBarPixelWidth);

    switch (m_nSymbology)
    {
    case CODE39:
        // get final character width
        //nTemp = m_csMessage.GetLength() + 2;
        nTemp = m_csMessage.length() + 2;

        // add message
        m_nFinalBarcodePixelWidth = nTemp * ((3 * m_nWideBarPixelWidth) + (7 * m_nNarrowBarPixelWidth));

        break;
    case COD128:
        // get final character width
        //nTemp = m_csMessage.GetLength();
        nTemp = m_csMessage.length();

        m_nFinalBarcodePixelWidth = ((nTemp * 11) + 35)*m_nNarrowBarPixelWidth;

        break;
    case CODE93:
        // get final character width
        //nTemp = m_csMessage.GetLength();
        nTemp = m_csMessage.length();

        m_nFinalBarcodePixelWidth = (((nTemp + 4) * 9) + 1)*m_nNarrowBarPixelWidth;
    case UPCEAN:
    case TRADITIONALCODABAR:
        break;
    }

    return;
}
long CBarcode::GetBarcodePixelHeight()
{
    return m_nPixelHeight;
}

long CBarcode::GetBarcodePixelWidth()
{
    return m_nFinalBarcodePixelWidth;
}

Code39.h

// Code39.h: interface for the CCode39 class.
//
//  Copyright 2002 Neil Van Eps
//
//////////////////////////////////////////////////////////////////////
#ifndef CODE39_H
#define CODE39_H

#include "Barcode.h"

class CCode39 : public CBarcode
{
public:
    //void BitmapToClipboard();
    void DrawBitmap(QPainter *painter = nullptr);
    CCode39();
    virtual ~CCode39();
private:
    void    DrawPattern(QString csPattern, QPainter *painter);
    QString RetrievePattern(char c);

};

#endif // !defined(AFX_CODE39_H__6FE17747_EADF_4E89_9DCF_7688B04897BC__INCLUDED_)

Code39.cpp

// Code39.cpp: implementation of the CCode39 class.
//
//  Copyright 2002 Neil Van Eps
//
//////////////////////////////////////////////////////////////////////
#include "Code39.h"
#include <QPainter>
#include <QImage>
#include <QPen>
#include <QChar>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCode39::CCode39()
{
    // code 39
    m_nSymbology = CODE39;
}

CCode39::~CCode39()
{

}

////////////////////////////////////////////////////////////////////////////////////
//
//  Name:
//      DrawBitmap()
//
//  Description:
//      draws a barcode using the previously loaded data
//
//  Arguments:
//      none
//
//  Return:
//      void
//
//  Called by:
//      public class interface
//
////////////////////////////////////////////////////////////////////////////////////
//这里有一个问题 我怎么搞到图片大小呢
void CCode39::DrawBitmap(QPainter *painter)
{
    int     i;
    QString csCurrentPattern;
    DrawPattern(RetrievePattern(‘*‘), painter);

    // draw each character in the message
    for (i=0;i<m_csMessage.length();i++)
        DrawPattern(RetrievePattern(m_csMessage.at(i).toLatin1()), painter);

    // draw stop character, also an asterisk
    DrawPattern(RetrievePattern(‘*‘), painter);
    return;
}

////////////////////////////////////////////////////////////////////////////////////
//
//  Name:
//      DrawPattern()
//
//  Description:
//      draws the passed character pattern at the end of the barcode
//
//  Arguments:
//      CString     csPattern   -   the bar pattern to draw
//
//  Return:
//      void
//
//  Called by:
//      CRationalCodabar::DrawBitmap()
//
////////////////////////////////////////////////////////////////////////////////////

void CCode39::DrawPattern( QString csPattern ,QPainter *painter)
{
    int         i, nXPixel, nYPixel, nTempWidth;

    QPen penbar = QPen(Qt::black);
    penbar.setWidth(1);
    penbar.setStyle(Qt::SolidLine);
    QPen penspace = QPen(Qt::white);
    penspace.setWidth(1);
    penspace.setStyle(Qt::SolidLine);
    painter->setRenderHint(QPainter::Antialiasing, true);
    // initialize X pixel value
    nXPixel = m_nStartingXPixel;

    for (i = 0; i < csPattern.length(); i++)
    {
        // decide if narrow or wide bar
        if (csPattern.at(i) == L‘n‘)
            nTempWidth = m_nNarrowBarPixelWidth;
        else
            nTempWidth = m_nWideBarPixelWidth;

        // X value for loop
        for (nXPixel = m_nStartingXPixel; nXPixel < m_nStartingXPixel + nTempWidth; nXPixel++)
        {
            if (i % 2 == 0)
                painter->setPen(penbar);
            else
                painter->setPen(penspace);
            painter->drawLine(nXPixel, m_nStartingYPixel, nXPixel, m_nStartingYPixel + m_nPixelHeight);
        }

        // advance the starting position
        m_nStartingXPixel += nTempWidth;
    }

    //
    //oDC.SelectObject(hPenOld);

    //::DeleteObject(hPenBar);
    //::DeleteObject(hPenSpace);

    // detach from the device context
    //oDC.Detach();

    return;
}

////////////////////////////////////////////////////////////////////////////////////
//
//  Name:
//      RetrievePattern()
//
//  Description:
//      retrieves the bar pattern for a given character
//
//  Arguments:
//      char    cInputCharacter -   the input character to get the bar pattern for
//
//  Return:
//      CString -   the bar pattern for the input character
//
//  Called by:
//      CRationalCodabar::DrawBitmap()
//
////////////////////////////////////////////////////////////////////////////////////

QString CCode39::RetrievePattern(char c)
{
    QString csCharPattern;

    switch (c)
    {
        case ‘1‘:
            csCharPattern = "wnnwnnnnwn";
            break;
        case ‘2‘:
            csCharPattern = "nnwwnnnnwn";
            break;
        case ‘3‘:
            csCharPattern = "wnwwnnnnnn";
            break;
        case ‘4‘:
            csCharPattern = "nnnwwnnnwn";
            break;
        case ‘5‘:
            csCharPattern = "wnnwwnnnnn";
            break;
        case ‘6‘:
            csCharPattern = "nnwwwnnnnn";
            break;
        case ‘7‘:
            csCharPattern = "nnnwnnwnwn";
            break;
        case ‘8‘:
            csCharPattern = "wnnwnnwnnn";
            break;
        case ‘9‘:
            csCharPattern = "nnwwnnwnnn";
            break;
        case ‘0‘:
            csCharPattern = "nnnwwnwnnn";
            break;
        case ‘A‘:
            csCharPattern = "wnnnnwnnwn";
            break;
        case ‘B‘:
            csCharPattern = "nnwnnwnnwn";
            break;
        case ‘C‘:
            csCharPattern = "wnwnnwnnnn";
            break;
        case ‘D‘:
            csCharPattern = "nnnnwwnnwn";
            break;
        case ‘E‘:
            csCharPattern = "wnnnwwnnnn";
            break;
        case ‘F‘:
            csCharPattern = "nnwnwwnnnn";
            break;
        case ‘G‘:
            csCharPattern = "nnnnnwwnwn";
            break;
        case ‘H‘:
            csCharPattern = "wnnnnwwnnn";
            break;
        case ‘I‘:
            csCharPattern = "nnwnnwwnnn";
            break;
        case ‘J‘:
            csCharPattern = "nnnnwwwnnn";
            break;
        case ‘K‘:
            csCharPattern = "wnnnnnnwwn";
            break;
        case ‘L‘:
            csCharPattern = "nnwnnnnwwn";
            break;
        case ‘M‘:
            csCharPattern = "wnwnnnnwnn";
            break;
        case ‘N‘:
            csCharPattern = "nnnnwnnwwn";
            break;
        case ‘O‘:
            csCharPattern = "wnnnwnnwnn";
            break;
        case ‘P‘:
            csCharPattern = "nnwnwnnwnn";
            break;
        case ‘Q‘:
            csCharPattern = "nnnnnnwwwn";
            break;
        case ‘R‘:
            csCharPattern = "wnnnnnwwnn";
            break;
        case ‘S‘:
            csCharPattern = "nnwnnnwwnn";
            break;
        case ‘T‘:
            csCharPattern = "nnnnwnwwnn";
            break;
        case ‘U‘:
            csCharPattern = "wwnnnnnnwn";
            break;
        case ‘V‘:
            csCharPattern = "nwwnnnnnwn";
            break;
        case ‘W‘:
            csCharPattern = "wwwnnnnnnn";
            break;
        case ‘X‘:
            csCharPattern = "nwnnwnnnwn";
            break;
        case ‘Y‘:
            csCharPattern = "wwnnwnnnnn";
            break;
        case ‘Z‘:
            csCharPattern = "nwwnwnnnnn";
            break;
        case ‘-‘:
            csCharPattern = "nwnnnnwnwn";
            break;
        case ‘.‘:
            csCharPattern = "wwnnnnwnnn";
            break;
        case ‘ ‘:
            csCharPattern = "nwwnnnwnnn";
            break;
        case ‘*‘:
            csCharPattern = "nwnnwnwnnn";
            break;
        case ‘$‘:
            csCharPattern = "nwnwnwnnnn";
            break;
        case ‘/‘:
            csCharPattern = "nwnwnnnwnn";
            break;
        case ‘+‘:
            csCharPattern = "nwnnnwnwnn";
            break;
        case ‘%‘:
            csCharPattern = "nnnwnwnwnn";
            break;
    }

    return csCharPattern;
}

////////////////////////////////////////////////////////////////////////////////////
//
//  Name:
//      BitmapToClipboard()
//
//  Description:
//      puts the specified bitmap on the clipboard
//
//  Arguments:
//      none
//
//  Return:
//      void
//
//  Called by:
//      public class interface - called by users of the class
//
////////////////////////////////////////////////////////////////////////////////////
#if 0
void CCode39::BitmapToClipboard()
{
    CDC                 memDC;
    CBitmap             oBitmap;

    memDC.CreateCompatibleDC(NULL);

    m_hDC = memDC.GetSafeHdc();

    // create compatible, correctly sized bitmap
    oBitmap.CreateCompatibleBitmap(&memDC,m_nFinalBarcodePixelWidth,m_nPixelHeight);

    // select our bitmap into the device context
    CBitmap * oldbm = memDC.SelectObject(&oBitmap);

    // turn area white - stock black bitmap is selected
    memDC.BitBlt(0,0,m_nFinalBarcodePixelWidth,m_nPixelHeight,NULL,0,0,WHITENESS);

    // draw bitmap into memory device context
    DrawBitmap();

    // put bitmap on clipboard
    ::OpenClipboard(NULL);
    ::EmptyClipboard();
    ::SetClipboardData(CF_BITMAP, oBitmap.m_hObject);
    ::CloseClipboard();

    //  deselect object out of device context
    memDC.SelectObject(oldbm);

    // make sure bitmap not deleted with CBitmap object
    oBitmap.Detach();

    return;
}
#endif

mytest.cpp中的调用

QPrintDialog dialog(&m_printer, this);
if (dialog.exec() == QDialog::Accepted)
{
    QPainter painter(&m_printer);
    CCode39 mycode;
    mycode.LoadData(QString("ST-1435887826818763"), QString("pos.jpg"), 1, 30, 5, 5, 3.0);
    mycode.DrawBitmap(&painter);
}

4.参考

Barcode.h Barcode.cpp Code39.h Code39.cpp是codeproject上的代码用mfc写的 我改动了下

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-28 17:12:44

qt实现小票打印的相关文章

Atitit.收银机小票打印功能的设计&#160;&#160;java&#160;php&#160;c#.net版本

Atitit.收银机小票打印功能的设计  java php c#.net版本 1. 1. 打印方式有4种:1 1.1. 1.1. 一是不经过任何修改,直接调用javascript中的window.print()打印.1 1.2. 1.2. 二根据客户要求的报表格式,编写相应格式的html,装载数据打印,同样调用window.print()打印,只是对html的格式要求比较高.1 1.3. 1.3. 三是通过客户提供的word格式,通过xml配置文件与数据库的数据进行关联,自动装载数据到word中

“小票打印”功能来了!酷客多带你玩转小程序

酷客多(http://www.kukeduo.cn)最近给小程序推出了一个新功能,小票打印功能,可以说这是众多运营者期待已久的功能,这次终于等到了.对于餐饮业运营者来说,这次新功能的推出更加给予了他们极大的便利.现在马上带你感受感受这次酷客多推出的重磅功能! 一.打印准备 1. 打开包装 2. 装入打印纸 移除 二.打印本机信息(用于商家后台配置) 1. 接通打印机电源 2. 长按左键开启打印机 移除 3. 初次开机会自动打印提示 4. 按右键进入菜单 移除 5. 按右键,打印本机信息 移除 三

酷客多小程序新版发布:与微信卡券、小票打印等无缝对接

酷客多小程序商城系统更新了!酷客多小程序商城系统更新了!酷客多小程序商城系统更新了!重要的事情说3遍!这一次我们对原有版本做了全方位体验优化,从UI UE等方面对商家后台进行了体验式改善,使商家后台变得更加美观和易用.除此之外,还推出了"微信优惠券"和"小票打印"两个重要功能 ,已实现与微信卡券和小票打印机无缝对接,更便于品牌传播.具体的功能说明请见下文. 一.左侧导航菜单优化 1,调整了左侧栏目的显示顺序,显示顺序改为"店铺管理"-"

Android打印机--小票打印格式及模板设置

小票打印就是向打印设备发送控制打印格式的指令集,而这些打印格式需要去查询对应打印机的API文档,这里我把常用的api给封装了一下 文字对齐方式 打印字体大小 字体是否加粗 打印二维码 打印条形码 切纸 打开钱箱 字符串转字节数组 字符拼接 PrintFormatUtils.java /** * 打印格式 * Created by john on 17-3-23. */ public class PrintFormatUtils { // 对齐方式 public static final int

更好的小票打印体验,huanent.printer2.0发布

huanent.printer2.0是一个专注消费小票打印的类库.拥有许多先进的特性例如居中打印.自动换行等特性,可以通过简洁的代码来打印出复杂的消费小票.huanent.printer通过MIT方式授权,可随意用于商业用途,只要注明作者即可. 你可以通过github获取源码与提交bug:https://github.com/huanent/Huanent.Printer huanent.printer已上传至nuget,可在nuget直接搜索名称huanent.printer安装 下面三幅图是

关于一体机打印新加菜按钮更改为下单小票打印设置FAQ(适用正餐6.0.1.0+,轻餐4.0.6.2+)

适用版本:正餐6.0.1.0+,轻餐4.0.6.2+ 实际场景:更新后小票设置中的打印新加菜按钮更换为下单小票打印设置,更换后,设置中,有3个选项: 1.仅打印新加菜    (选中后,订单加菜后前台小票只打印新点的菜品,之前订单中的菜品不打印) 2.不打印下单小票(首次下单和加菜时,都仅打印设置的后厨和传菜小票,不打印前台小票) 3.打印完整菜单(首次下单和加菜时,前台小票都会将订单中的菜品完整打印) 注意:客户端中的这三个选项是和管理员后台中店铺配置里面此处中的选择关联, 1.当客户端选择不打

重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印

重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印 一.引言 桌面端系统经常需要对接各种硬件设备,比如扫描器.读卡器.打印机等. 这里介绍下桌面端系统打印经常使用的场景. 1.一种是类似票务方面的系统需要打印固定格式的票据.比如景点门票.车票.电影票. 这种基本是根据模板调整位置套打. 2.还有一种是交易小票,比如商超POS小票,打印长度会随着内容的大小自动伸缩. 这种就不仅仅是固定格式的套打了,还得计算数据行以适应不同的打印长度. 打印方式

【JS】通过JS实现超市小票打印功能——ActiveX控件

应客户的需求= = ,要在网页端实现打印小票的功能 先来一张打印出的小票效果图(合计明显不对,因为有修改订单功能,请各位忽略) 用什么方法实现呢:我想应该是有三种吧 1.用第三方的浏览器控件(这个好似比较方便,我的老师也是这样建议我)向大家推荐一个 Lodop打印控件 2.用CSS写好模板,然后直接用页面打印的方法(应该是这样吧) (以上两种还没有尝试,这两天陆续尝试) 3.用微软自己的ActiveX控件(ActiveX控件可以实现调用本地的文件等操作(之前试过调用cmd,实现shutdown

SQL 存储过程 超市小票打印

create database chaoshils--创建一个数据库 go use chaoshils--使用这个数据库 go create table gongying--创建一个供应商的表格 ( gcode int primary key identity(1001,1),--供应商编号,主键 gname varchar(20),--名称 gsdh varchar(20),--电话 gsdz varchar(20)--地址 ) --向供应商表格中添加数据 insert into gongyi