基于Qt的收银点餐系统之小票打印(二)
来源:互联网 发布:淘宝上的东西是正品吗 编辑:程序博客网 时间:2024/05/16 06:42
本篇给出基于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的收银点餐系统之小票打印(二)
- 基于Qt的收银点餐系统之小票打印(一)
- 基于Qt的收银点餐系统之UI的基本实现(二)
- 基于Qt的收银点餐系统之UI的基本实现(一)
- 基于Qt的收银点餐系统之UI的改进——QStackedLayout和QScrollArea的使用
- 基于Qt的收银点餐系统之解决因网络请求延迟而带来的问题
- 基于Qt的收银点餐系统之多个相同子控件与父控件间的交互
- Qt实现小型的超市收银系统
- Java小项目点餐系统(二)之服务端
- 基于C#的超市收银管理系统
- Atitit.收银系统pos 以及打印功能的行业标准
- 基于qt和mysql的学生注册系统(二)
- 基于qt和mysql的学生注册系统(二)
- 【Qt 5.3.2】Qt局域网收银软件(Qt+MySQL+小票打印机(58mm)+普通打印机)
- C#小项目:模拟超市收银系统
- 银行收银系统(C#)
- Java小项目点餐系统(一)之客户端
- Qt小票打印之网口程序
- Windows 2012 下Redmine安装和环境搭建
- 泰国旅游记
- linux 服务器网络测试
- HTML基础(二)
- Angular 表单判断密码
- 基于Qt的收银点餐系统之小票打印(二)
- Uva 10129 (dfs判断连通 +欧拉回路)
- 数据库学习---2
- 约束
- python mysql简单操作,报错处理
- angularjs的表格的增删改查(关于商品)
- Swift中泛型的属性
- Tensorflow 05: 导入预训练好的图模型
- opencv显示图像