基於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就是記錄了電腦裡連線的印表機的各種資訊了。可以通過唯一表示印表機的名字(即目標的物理實體的印表機,可以在電腦的“裝置和印表機”
使用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進行操作