您现在的位置是:网站首页> C/C++

Qt调用打印机和打印机预览代码

  • C/C++
  • 2021-11-11
  • 981人已阅读
摘要
 一个简单的打印和打印预览示例代码
可能是由于内容开始是网络地址(http://...)完整的英文词截取后不能换行造成 为避免代码造成手机端排版的混乱,可适当增加文字描述,将代码往后推移

头文件
  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.   
  4. #include <QMainWindow>  
  5.   
  6. namespace Ui {  
  7. class MainWindow;  
  8. }  
  9.   
  10. class QPrinter;  
  11.   
  12. class MainWindow : public QMainWindow  
  13. {  
  14.     Q_OBJECT  
  15.   
  16. public:  
  17.     explicit MainWindow(QWidget *parent = 0);  
  18.     ~MainWindow();  
  19.   
  20. private:  
  21.     Ui::MainWindow *ui;  
  22. private slots:  
  23.     void OnTestPrint();  
  24.     void OnTestPrintPreview();  
  25.   
  26.     void printDocument(QPrinter *printer);  
  27. };  
  28.   
  29. #endif // MAINWINDOW_H  
源文件
  1. #include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3.   
  4. #include <QMessageBox>  
  5. #include <QDebug>  
  6.   
  7. #include <QPrinter>  
  8. #include <QPrintDialog>  
  9. #include <QPrintPreviewDialog>  
  10.   
  11. #include <QPainter>  
  12.   
  13. /* 
  14.  * Qt5打印支持  QT += printsupport 
  15.  * */  
  16.   
  17. MainWindow::MainWindow(QWidget *parent) :  
  18.     QMainWindow(parent),  
  19.     ui(new Ui::MainWindow)  
  20. {  
  21.     ui->setupUi(this);  
  22.   
  23.     //打印  
  24.     connect(ui->pbTestPrint,SIGNAL(released()),this,SLOT(OnTestPrint()));  
  25.   
  26.     //打印预览  
  27.     connect(ui->pbTestPrintPreview,SIGNAL(released()),this,SLOT(OnTestPrintPreview()));  
  28. }  
  29.   
  30. MainWindow::~MainWindow()  
  31. {  
  32.     delete ui;  
  33. }  
  34.   
  35. void MainWindow::OnTestPrint()  
  36. {  
  37.     QPrinter printer(QPrinter::HighResolution);  
  38.     QPrintDialog dialog(&printer, this);  
  39.     if (dialog.exec() != QDialog::Accepted)  
  40.         return;  
  41.   
  42.     //默认为零,如果用户选择了打印范围,以1为基数。  
  43.     //printer.fromPage();  
  44.     //printer.toPage();  
  45.   
  46.     //设置打印范围,以1为基数。  
  47.      //printer.setFromTo(1, LastNumberOfPage);  
  48.   
  49.     qDebug("The user has choiced printer.");  
  50.   
  51.     printDocument(&printer);  
  52. }  
  53.   
  54. //测试打印预览功能  
  55. void MainWindow::OnTestPrintPreview()  
  56. {  
  57.     QPrinter printer(QPrinter::HighResolution);  
  58.     QPrintPreviewDialog preview(&printer, this);  
  59.     connect(&preview, SIGNAL(paintRequested(QPrinter*)),  
  60.             this, SLOT(printDocument(QPrinter*)));  
  61.     preview.exec();  
  62. }  
  63.   
  64.   
  65. void MainWindow::printDocument(QPrinter *printer)  
  66. {  
  67.     //http://doc.qt.io/qt-5/qpainter.html  
  68.     QPainter painter;  
  69.     painter.begin(printer);  
  70.   
  71.     QString family("Arial");  
  72.     QString style("Normal");  
  73.   
  74.     //  
  75.     QFont font(family, 32, 50, false);  
  76.     font.setStyleName(style);  
  77.     font = QFont(font, painter.device());  
  78.   
  79.     //  
  80.     QFontMetricsF fontMetrics(font);  
  81.     QRectF rect = fontMetrics.boundingRect(QString("%1 %2").arg(family).arg(style));  
  82.   
  83.     //如果不scale的话,会因为打印的字太小而看不见。  
  84.     qreal xScale = printer->pageRect().width() / rect.width();  
  85.     qreal yScale = printer->pageRect().height() / rect.height();  
  86.     double scale = qMin(xScale, yScale);  
  87.   
  88.     //  
  89.     //Saves the current painter state (pushes the state onto a stack).  
  90.     painter.save();  
  91.     //Translates the coordinate system by the given offset;  
  92.     painter.translate(printer->pageRect().width() / 2.0, printer->pageRect().height() / 2.0);  
  93.     //Scales the coordinate system by (sX, sY).  
  94.     painter.scale(scale, scale);  
  95.   
  96.     //Background x character for assure the bound and string draw orientation.  
  97.     painter.setBrush(QBrush(Qt::white));  
  98.     painter.drawRect(0,0,rect.width()/2,rect.height());  
  99.     painter.setBrush(QBrush(Qt::black));  
  100.     painter.drawLine(0, 0, rect.width()/2, rect.height());  
  101.     painter.drawLine(0, rect.height(), rect.width()/2, 0);  
  102.   
  103.     //Notice string vertical orientation in printer is negative from screen.  
  104.     painter.drawText(QPointF(0,0),  
  105.                      QString("%1-%2").arg(family).arg(style));  
  106.   
  107.     //Restores the current painter state (pops a saved state off the stack).  
  108.     painter.restore();  
  109.   
  110.     //before begin new page.  
  111.     //printer->newPage();  
  112.   
  113.     //after all done.  
  114.     painter.end();  
  115. }  


Top