1. 程式人生 > >基於Qt的收銀點餐系統之小票列印(一)

基於Qt的收銀點餐系統之小票列印(一)

待解決問題:

顧客在點餐完畢後給列印一份小票。如圖所示:
這裡寫圖片描述

解決方案:最開始拿到了一個基於JAVA實現的小票列印demo,使用的是ECS/POS指令集。但是並沒有成功地用Qt也實現出來。
本文基於QPainter + QPrinter 實現小票列印 (程式碼見下一篇)。

一、Qt中與列印相關的類

請先閱讀:http://blog.csdn.net/amnes1a/article/details/70597506
在上面的參考文章中,一共提到了5種與列印相關的類。在收銀點餐系統中,我用到了三種QPrinter、QPrinterDialog、 QPrinterInfo。對它們的理解如下:
1) QPrinter和QPrinterDialog
QPrinter其實和QWidget、QPixel一樣,是需要展示的東西(文字、圖片)的展現載體而已。它藉助“印表機

”這個實體裝置將內容列印在紙上。
在使用QPrinter時,所需要設定的引數大體有以下幾種:
這裡寫圖片描述
以及一個很重要的隱形引數:那個物理實體的印表機是誰。
**這些性質,可以通過QPrinter的例項進行設定,也可以通過QPrinterDialog來設定。**QPrinterDialog會彈出一個對話方塊,所以更為可見,適用於改變列印參量較多的情況。而前者,就是採用程式碼設定的方式;此外還也可以自己寫介面,允許使用者去改變(這樣子相當於自己寫了一個“QPrinterDialog”)。

2)QPrinterInfo
QPrinterInfo就是記錄了電腦裡連線的印表機的各種資訊了。可以通過唯一表示印表機的名字(即目標的物理實體的印表機,可以在電腦的“裝置和印表機”

進行修改 ps:這樣子把一部分工作轉給了電腦本身)來建立一個QPrinterInfo,然後用它來構造一個QPrinter。

使用QDialogPrinter和QPrinterInfo均可以呼叫印表機。前者每一次都會彈出設定對話方塊;而後者則可以實現越過設定對話方塊直接進行列印(相關設定直接在QPrinter上操作)。具體的用法見下文第四點。

二、列印的資料來源

印表機所需列印的資料 的來源可以是以下控制元件:
(1) QWebView,QWebFrame,作為html檔案格式的載體;
(2) QPlainTextEdit,QTextEdit, 單行/多行文字編輯區域;
(3) QPainter,用於繪圖的類,可處理圖片格式的檔案;
(4) QPrintPreviewWidget,專門用於列印預覽的控制元件;
(5) QTextDocument,文件型別的檔案處理;
以上控制元件都有一個共同點,都有print()函式,將設定好的QPrinter傳入即可,輸出對應的檔案。

上面控制元件與QPrinter的關係:控制元件類所承載的東西其實就是各種資訊的表現形式:html、圖片、文件等。html、圖片、文件這些東西可以是顯示在螢幕上,也可以是通過印表機打印出來。而QPrinter就是設定用於列印的印表機的性質,也就是說你列印的內容(甚至連排版也是)與Qprinter沒有關係,Qprinter控制的是列印的方向、紙張大小之類的屬性。
參考:http://m.blog.csdn.net/qqbitqqbit/article/details/17722507

QPainter用來執行繪製的操作;QPaintDevice是一個二維空間的抽象,這個二維空間可以由QPainter在上面進行繪製;QPaintEngine提供了畫筆painter在不同的裝置上進行繪製的統一的介面。
Qt的繪圖系統實際上是說,使用QPainter在QPainterDevice上面進行繪製,它們之間使用QPaintEngine進行通訊。

再來看QPainter的一個建構函式:

QPainter ( QPaintDevice * device )

當使用下面語句例項化一個QPainter時,語句如下:

 QPainter painter(printer);

也就是說pritner是painter的PainterDevice。 painter負責內容、排版;printer是負責將內容呈現到紙上的裝置。

四、列印過程

在Qt中,列印與在 QWidget,QPixmap或者QImage繪圖很相似,一般步驟如下:
1、建立繪圖用的QPrinter;
2、彈出列印對話方塊,QPrintDialog,允許使用者選擇印表機,設定屬性等;(或利用QPrinterInfo建立)
3、建立一個使用上面設定好了的Printer作為繪製裝置的QPainter;
4、用QPainter繪製一頁;
5、呼叫QPrinter::newPage(),然後繪製下一頁;
6、重複步驟4,5,直到列印完所有頁。

上文提到,使用QDialogPrinter和QPrinterInfo均可以呼叫印表機,具體用法如下:
1.基於QDialogPrinter

    QPrinter printer;
    QPrintDialog printDialog(&printer,this);
    if(printDialog.exec()){   //用視覺化的printDialog對printer進行列印設定
        QPainter painter(&printer);
        //接下來對painter進行操作
    }

2.基於QPrinterInfo

    QPrinterInfo targetPrinter = QPrinterInfo::printerInfo(QString(tr("XXX印表機")));  //填入印表機的名字
    QPrinter printer(targetPrinter,QPrinter::PrinterResolution);  //建立QPrinter的例項
    printer.setOutputFormat(QPrinter::PdfFormat);  //設定pritner
    printer.setPageSize(QPagedPaintDevice::A4);
    QPainter painter(&printer);
    //接下來對painter進行操作