本篇给出基于QPrinter+QPainter的小票打印代码。

一、说明

类ReceiptPainter继承了QPainter,专门用于打印小票,在方法doCustomerPrint()中进行打印。
其成员变量OrderDetailBean* orderDetail 是订单的详细信息。包含有:
时间、编号、总价、收款、找零,以及订单中每样商品的详细信息:名称、数量、单价
main函数中的调用代码:

QString targetPrinterName = "XX打印机";
QPrinterInfo targetPrinter = QPrinterInfo::printerInfo(targetPrinterName);
QPrinter printer(targetPrinter);
ReceiptPainter rPainter(&printer,orderDetailItem,shopName);

在使用QPrinter+QPainter进行小票打印中,打印内容以及排版在QPainter中进行设置。由下面代码将看出,与其说QPainter是对文字进行了排版,还不如说是QPainter对“矩形”进行了排版,然后才在各个矩形中填上了文字。这主要是由QPainter绘制文字的方式决定的。

QPainter::drawText ( const QRectF &rectangle,  const QString & text )

参考文章:http://www.qter.org/portal.php?mod=view&aid=40

二、代码

ReceiptPainter.h

#ifndef RECEIPTPAINTER_H
#define RECEIPTPAINTER_H
#include <QPaintEvent>
#include <QtPrintSupport/QPrinter>
#include <QtPrintSupport/QPrintDialog>
#include <QPainter>
#include <QWidget>
#include <QList>#include <QString>
#include <QChar>
#include <QVector>
#include "orderdetailbean.h"
#include "ordergoodsbean.h"class ReceiptPainter : public QPainter
{public:ReceiptPainter(QPrinter*,OrderDetailBean*,QString);~ReceiptPainter();void doCustomerPrint();QString getSeperator(double);
private://下面的数字单位是 像素// 字体大小enum {FONT_SIZE_NORMAL = 10,FONT_SIZE_MIDDLE = 12,FONT_SIZE_BIG = 20};  //正常、中等、大//预留尺寸enum {TOTAL_LENGTH = 140,GOODS_LENGTH = 40,GOODS_NUM_LENGTH = 40}; //小票每一行的可以打印的位数、商品名称的预留长度、商品数量的预留长度OrderDetailBean* orderDetail;  //订单的详细信息:时间、编号、总价、收款、找零,以及订单中每样商品的详细信息:名称、数量、单价QString shopName;
};#endif // RECEIPTPAINTER_H

ReceiptPainter.cpp

#include "receiptpainter.h"
#include <QByteArray>
#include <QTextCodec>
#include <QDebug>
#include <QRect>
#include <QPen>
#include <QBrush>
#include <QFont>
ReceiptPainter::ReceiptPainter(QPrinter* printer,OrderDetailBean* od,QString sn):QPainter(printer)
{orderDetail = od;shopName = sn;doCustomerPrint();}QString ReceiptPainter::getSeperator(double width){int per = 12;  //360pt可以打30个*int cnt = width / per;QString sep;for(int i = 0; i < cnt; i++) sep.append("* ");return sep;
}void ReceiptPainter::doCustomerPrint(){double rt = 0.38;QFont font1("宋体",FONT_SIZE_NORMAL,QFont::Bold);QFont font2("宋体",FONT_SIZE_NORMAL);QFont font3("宋体",FONT_SIZE_NORMAL,QFont::Bold);QFont font4("宋体",FONT_SIZE_MIDDLE);int xx1 = 50 * rt;int xx2 = 410 * rt;int xx3 = 545 * rt;//w1 w2 w3 分别是品名、数目、单价的所在栏占的宽度int w1 = 360 * rt;  int w2 = 135 * rt;int w3 = 150 * rt;//h1 h2 分别适用于两种字体大小int h1 = 48 * rt;int h2 = 35 * rt;int h3 = 60 * rt;QString seperator = getSeperator(w1+w2+w3);//打印店名QRect rect(xx1,0,w1+w2+w3,h1);this->setFont(font1);this->drawText(rect,Qt::AlignCenter,shopName);//打印订单号和时间rect.setY(rect.y()+rect.height());rect.setHeight(h2);this->setFont(font2);this->drawText(rect,"时间:"+orderDetail->getTime());rect.setY(rect.y()+rect.height());rect.setHeight(h2);this->drawText(rect,"堂食: "+ QString::number(orderDetail->getSerialNo()));//分隔符rect.setY(rect.y()+rect.height());rect.setHeight(h2);this->drawText(rect,seperator);//品名                数量 单价this->setFont(font3);rect.setY(rect.y()+rect.height());rect.setHeight(h2);rect.setX(xx1);rect.setWidth(w1);this->drawText(rect,Qt::AlignLeft,"品名");rect.setX(xx2);rect.setWidth(w2);this->drawText(rect,Qt::AlignLeft,"数量");rect.setX(xx3);rect.setWidth(w3);this->drawText(rect,Qt::AlignLeft,"单价");//打印商品this->setFont(font2);QList<OrderGoodsBean*> goodsList = orderDetail->getOrderGoodsList();OrderGoodsBean* orderGoodsItem = new OrderGoodsBean();for (int i = 0; i < goodsList.size(); i++) {orderGoodsItem = goodsList.at(i);QString nname = orderGoodsItem->getName();QString num = QString::number(orderGoodsItem->getAmount(),'g',10);QString price = QString::number(orderGoodsItem->getPrice(),'g',10);rect.setY(rect.y()+rect.height());rect.setHeight(h2);rect.setX(xx1);rect.setWidth(w1);this->drawText(rect,Qt::AlignLeft,nname);rect.setX(xx2);rect.setWidth(w2);this->drawText(rect,Qt::AlignLeft,num);rect.setX(xx3);rect.setWidth(w3);this->drawText(rect,Qt::AlignLeft,"¥" + price);}//分隔符rect.setY(rect.y()+rect.height());rect.setHeight(h2);rect.setX(xx1);rect.setWidth(w1+w2+w3);this->drawText(rect,seperator);//打印总价、付款、找零信息QString tp = QString::number(orderDetail->getTotalPrice(),'g',10);QString pm = QString::number(orderDetail->getPaidMoney(),'g',10);QString cg = QString::number(orderDetail->getChange(),'g',10);this->setFont(font4);rect.setY(rect.y()+rect.height());rect.setHeight(h1);rect.setX(xx1);rect.setWidth(w1+w2);this->drawText(rect,Qt::AlignLeft,"共计:");rect.setX(xx3);rect.setWidth(w3);this->drawText(rect,Qt::AlignLeft,tp);rect.setY(rect.y()+rect.height());rect.setHeight(h1);rect.setX(xx1);rect.setWidth(w1+w2);this->drawText(rect,Qt::AlignLeft,"已收款:");rect.setX(xx3);rect.setWidth(w3);this->drawText(rect,Qt::AlignLeft,pm);rect.setY(rect.y()+rect.height());rect.setHeight(h1);rect.setX(xx1);rect.setWidth(w1+w2);this->drawText(rect,Qt::AlignLeft,"找零:");rect.setX(xx3);rect.setWidth(w3);this->drawText(rect,Qt::AlignLeft,cg);//分隔符this->setFont(font2);rect.setY(rect.y()+rect.height());rect.setHeight(h2);rect.setX(xx1);rect.setWidth(w1+w2+w3);this->drawText(rect,seperator);}ReceiptPainter::~ReceiptPainter()
{}

参考文章:

Qt中的打印操作:http://blog.csdn.net/amnes1a/article/details/70597506
QT的打印基础: http://blog.csdn.net/yavobo/article/details/5643441
QT打印过程:http://m.blog.csdn.net/qqbitqqbit/article/details/17722507
Qt学习之路(24): QPainter: http://devbean.blog.51cto.com/448512/235332/
Qt5之2D绘图(三)绘制文字:http://www.qter.org/portal.php?mod=view&aid=40

基于Qt的收银点餐系统之小票打印(二)相关推荐

  1. 基于Qt的收银点餐系统之小票打印(一)

    待解决问题: 顾客在点餐完毕后给打印一份小票.如图所示: 解决方案:最开始拿到了一个基于JAVA实现的小票打印demo,使用的是ECS/POS指令集.但是并没有成功地用Qt也实现出来. 本文基于QPa ...

  2. 基于qt和mysql点菜系统的优点_基于QT的电子点餐订餐系统的设计与实现(SQLite)

    基于QT的电子点餐订餐系统的设计与实现(SQLite)(任务书,外文翻译,毕业论文20000字,程序代码,SQLite数据库,答辩PPT) 摘  要 在深入研究中小餐饮企业工作流程的基础上,分析制约餐 ...

  3. ssm基于jsp的在线点餐系统 毕业设计源码111016

    基于SSM的在线点餐系统 摘要 当前高速发展的经济模式下,人们工作和生活都处于高压下,没时间做饭,在哪做饭成了人们的难题,传统下班回家做饭的生活习俗渐渐地变得难以实现.在社会驱动下,我国在餐饮方面的收 ...

  4. linux点餐系统,基于Linux的智能点餐系统

    基于Linux的智能点餐系统 摘要:当今这个快节奏的社会,效率这个词被提升到了一个很重要的地位,不管工作上,还是生活上.饮食方面也是一个很重要的部分,尤其是在上班日,每个餐厅的人员都爆满,传统的现金付 ...

  5. 基于android餐馆点餐系统报告感想,基于Android的餐厅点餐系统的设计与实现

    摘要: 民以食为天,在日常的生活中,我们经常需要与家人,朋友,同事在一起就餐以便促进相互之间的感情.但是现在多数的餐厅企业基本上还是手工点餐操作,无法更好地适应新时期下人们对餐饮业服务的人性化和高效率 ...

  6. 基于Qt的车载GPS监控系统(2)需求分析

    基于Qt的车载GPS监控系统(2)需求分析 嵌入式开发培训(阶段3)嵌入式图形应用开发视频地址 冷链车载GPS监控系统 视频地址 项目实践流程: 1.设计项目需求文档 说明项目设计目的,项目功能,项目 ...

  7. 餐厅小票打印模板_哪些餐厅零售店有必要引入智能收银点餐机?

    随着科技的发展,人工智能硬件的开发也是越来越广泛,一些零售店和餐厅纷纷进行智慧升级,智能设备逐渐取代传统的零售.餐饮收银点餐设备,而智能自助点餐收银设备也纷纷上架应用. 许多人提出升级智慧餐厅,引入智 ...

  8. 基于STM32的智能点餐系统

    提示:记录2022年4月做的毕设4 文章目录 前言 一.功能要求: 二.代码思路 三.硬件说明 四.代码以及框图等资料 喜欢请点赞哦! 前言 基于STM32的智能点餐系统,主控使用STM32F103C ...

  9. 基于html的网上点餐系统,一种基于客户端的网上点餐系统的制作方法

    本发明涉及互联网技术领域,具体为一种基于客户端的网上点餐系统. 背景技术: 互联网是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一且巨大的全球化网络,在这个网络中有交 ...

最新文章

  1. JVM中的垃圾收集器
  2. 廖雪峰 python_40岁老男人从0开始学python实录(第1天)
  3. 中国首次实现量子优越性!比谷歌突破更厉害,比最强超级计算机快一百万亿倍 | Science...
  4. 阅读笔记:Solving the “false positives” problem in fraud prediction
  5. python结束if else_python | if else || where true 流程控制
  6. Scrapy学习-24-集成elasticsearch
  7. 第一篇 Entity Framework Plus 之 Audit
  8. find:查找文件或目录
  9. Linux crypto相关知识的汇总 Linux加密框架crypto对称算法和哈希算法加密模式
  10. Java的transient关键字
  11. 音视频开发(16)---海康IPC+NVR+EasyDarwin+EasyPusher+VLC实现Web实时播放RTSP视频
  12. 什么是广域网(WAN)?
  13. 中国银联在线支付接口开发——前台支付
  14. java推箱子图片素材下载_推箱子游戏素材 箱子图 背景图 人物图
  15. Python实现BF算法
  16. 熟练度=正确的知识 X 大量的刻意练习。
  17. PICO 开发者管理平台
  18. 《你可以不平凡》-- 周杰伦在北京大学百年讲堂的演讲
  19. 安装和使用PyInstaller生成window的exe和Mac的执行文件
  20. 患癌女孩冯莹的爱情梦想

热门文章

  1. 天刀服务器维护时间,《天涯明月刀》2021年3月10日服务器例行维护公告 服务器例行维护怎么样...
  2. 内网渗透-msf及socks代理转发
  3. comm java_JAVACOMM使用
  4. Linux系统学习导图整理
  5. 详细教程||基于51单片机开发的十路抢答器设计
  6. 记一次 .NET 某电子病历 CPU 爆高分析
  7. php框架启动过程,自己写php框架启动类
  8. steps_per_epoch 与 epochs 的关系
  9. 网站域名备案需要多长时间?个人经验分享
  10. npm run build appeared(出现) Cannot find module ‘webpack/lib/ModuleFilenameHelpers‘