1. 程式人生 > >Qt呼叫印表機和印表機預覽程式碼

Qt呼叫印表機和印表機預覽程式碼

轉載自點我呀

Date:  2016-6-15

Author: kagula

Introduction:

       一個簡單的列印和列印預覽示例程式碼。

Environment:

[1]Windows 7 64bits

[2]Qt Creator 3.6.1

[3]Qt 5.6

標頭檔案

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. namespace Ui {  
  5. class MainWindow;  
  6. }  
  7. class QPrinter;  
  8. class MainWindow : 
    public QMainWindow  
  9. {  
  10.     Q_OBJECT  
  11. public:  
  12.     explicit MainWindow(QWidget *parent = 0);  
  13.     ~MainWindow();  
  14. private:  
  15.     Ui::MainWindow *ui;  
  16. private slots:  
  17.     void OnTestPrint();  
  18.     void OnTestPrintPreview();  
  19.     void printDocument(QPrinter *printer);  
  20. };  
  21. #endif // MAINWINDOW_H


原始檔

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QMessageBox>
  4. #include <QDebug>
  5. #include <QPrinter>
  6. #include <QPrintDialog>
  7. #include <QPrintPreviewDialog>
  8. #include <QPainter>
  9. /* 
  10.  * Qt5列印支援  QT += printsupport 
  11.  * */
  12. MainWindow::MainWindow(QWidget *parent) :  
  13.     QMainWindow(parent),  
  14.     ui(new Ui::MainWindow)  
  15. {  
  16.     ui->setupUi(this);  
  17.     //列印
  18.     connect(ui->pbTestPrint,SIGNAL(released()),this,SLOT(OnTestPrint()));  
  19.     //列印預覽
  20.     connect(ui->pbTestPrintPreview,SIGNAL(released()),this,SLOT(OnTestPrintPreview()));  
  21. }  
  22. MainWindow::~MainWindow()  
  23. {  
  24.     delete ui;  
  25. }  
  26. void MainWindow::OnTestPrint()  
  27. {  
  28.     QPrinter printer(QPrinter::HighResolution);  
  29.     QPrintDialog dialog(&printer, this);  
  30.     if (dialog.exec() != QDialog::Accepted)  
  31.         return;  
  32.     //預設為零,如果使用者選擇了列印範圍,以1為基數。
  33.     //printer.fromPage();
  34.     //printer.toPage();
  35.     //設定列印範圍,以1為基數。
  36.      //printer.setFromTo(1, LastNumberOfPage);
  37.     qDebug("The user has choiced printer.");  
  38.     printDocument(&printer);  
  39. }  
  40. //測試列印預覽功能
  41. void MainWindow::OnTestPrintPreview()  
  42. {  
  43.     QPrinter printer(QPrinter::HighResolution);  
  44.     QPrintPreviewDialog preview(&printer, this);  
  45.     connect(&preview, SIGNAL(paintRequested(QPrinter*)),  
  46.             this, SLOT(printDocument(QPrinter*)));  
  47.     preview.exec();  
  48. }  
  49. void MainWindow::printDocument(QPrinter *printer)  
  50. {  
  51.     //http://doc.qt.io/qt-5/qpainter.html
  52.     QPainter painter;  
  53.     painter.begin(printer);  
  54.     QString family("Arial");  
  55.     QString style("Normal");  
  56.     //
  57.     QFont font(family, 32, 50, false);  
  58.     font.setStyleName(style);  
  59.     font = QFont(font, painter.device());  
  60.     //
  61.     QFontMetricsF fontMetrics(font);  
  62.     QRectF rect = fontMetrics.boundingRect(QString("%1 %2").arg(family).arg(style));  
  63.     //如果不scale的話,會因為列印的字太小而看不見。
  64.     qreal xScale = printer->pageRect().width() / rect.width();  
  65.     qreal yScale = printer->pageRect().height() / rect.height();  
  66.     double scale = qMin(xScale, yScale);  
  67.     //
  68.     //Saves the current painter state (pushes the state onto a stack).
  69.     painter.save();  
  70.     //Translates the coordinate system by the given offset;
  71.     painter.translate(printer->pageRect().width() / 2.0, printer->pageRect().height() / 2.0);  
  72.     //Scales the coordinate system by (sX, sY).
  73.     painter.scale(scale, scale);  
  74.     //Background x character for assure the bound and string draw orientation.
  75.     painter.setBrush(QBrush(Qt::white));  
  76.     painter.drawRect(0,0,rect.width()/2,rect.height());  
  77.     painter.setBrush(QBrush(Qt::black));  
  78.     painter.drawLine(0, 0, rect.width()/2, rect.height());  
  79.     painter.drawLine(0, rect.height(), rect.width()/2, 0);  
  80.     //Notice string vertical orientation in printer is negative from screen.
  81.     painter.drawText(QPointF(0,0),  
  82.                      QString("%1-%2").arg(family).arg(style));  
  83.     //Restores the current painter state (pops a saved state off the stack).
  84.     painter.restore();  
  85.     //before begin new page.
  86.     //printer->newPage();
  87.     //after all done.
  88.     painter.end();  
  89. }  

備註 [1] 經測試上文中測試待列印字串寬度的QFontMetricsF程式碼段是不正確的。 正確的應該參考下面的程式碼段,來得到在印表機上的物理寬度,奇怪的是這種方式不能得到高度。 painter.fontMetrics().width(instanceOfQString);
或 採用下面的初始化方式,能正確得到在印表機上的寬度和高度。 QFontMetricsF fm(instanceOfQFont,printer);//QPrinter*printer
fm.height() 補充閱讀 [1]在win7下執行QPrintPreviewDialog的程式碼,不能選擇印表機的問題 在pro檔案中加入
QTPLUGIN+=windowsprintersupport
部署exe程式的時候,把Qt安裝目錄 下的printsupport子目錄複製到exe所在的路徑下即可。