Qt5打印功能示例代码

来源:互联网 发布:单片机开发板有什么用 编辑:程序博客网 时间:2024/06/18 09:42

Date:  2016-6-15

Author: kagula

Introduction:

       一个简单的打印和打印预览示例代码。

Environment:

[1]Windows 7 64bits

[2]Qt Creator 3.6.1

[3]Qt 5.6


头文件

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>namespace Ui {class MainWindow;}class QPrinter;class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();private:    Ui::MainWindow *ui;private slots:    void OnTestPrint();    void OnTestPrintPreview();    void printDocument(QPrinter *printer);};#endif // MAINWINDOW_H


源文件

#include "mainwindow.h"#include "ui_mainwindow.h"#include <QMessageBox>#include <QDebug>#include <QPrinter>#include <QPrintDialog>#include <QPrintPreviewDialog>#include <QPainter>/* * Qt5打印支持  QT += printsupport * */MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    //打印    connect(ui->pbTestPrint,SIGNAL(released()),this,SLOT(OnTestPrint()));    //打印预览    connect(ui->pbTestPrintPreview,SIGNAL(released()),this,SLOT(OnTestPrintPreview()));}MainWindow::~MainWindow(){    delete ui;}void MainWindow::OnTestPrint(){    QPrinter printer(QPrinter::HighResolution);    QPrintDialog dialog(&printer, this);    if (dialog.exec() != QDialog::Accepted)        return;    //默认为零,如果用户选择了打印范围,以1为基数。    //printer.fromPage();    //printer.toPage();    //设置打印范围,以1为基数。     //printer.setFromTo(1, LastNumberOfPage);    qDebug("The user has choiced printer.");    printDocument(&printer);}//测试打印预览功能void MainWindow::OnTestPrintPreview(){    QPrinter printer(QPrinter::HighResolution);    QPrintPreviewDialog preview(&printer, this);    connect(&preview, SIGNAL(paintRequested(QPrinter*)),            this, SLOT(printDocument(QPrinter*)));    preview.exec();}void MainWindow::printDocument(QPrinter *printer){    //http://doc.qt.io/qt-5/qpainter.html    QPainter painter;    painter.begin(printer);    QString family("Arial");    QString style("Normal");    //    QFont font(family, 32, 50, false);    font.setStyleName(style);    font = QFont(font, painter.device());    //    QFontMetricsF fontMetrics(font);    QRectF rect = fontMetrics.boundingRect(QString("%1 %2").arg(family).arg(style));    //如果不scale的话,会因为打印的字太小而看不见。    qreal xScale = printer->pageRect().width() / rect.width();    qreal yScale = printer->pageRect().height() / rect.height();    double scale = qMin(xScale, yScale);    //    //Saves the current painter state (pushes the state onto a stack).    painter.save();    //Translates the coordinate system by the given offset;    painter.translate(printer->pageRect().width() / 2.0, printer->pageRect().height() / 2.0);    //Scales the coordinate system by (sX, sY).    painter.scale(scale, scale);    //Background x character for assure the bound and string draw orientation.    painter.setBrush(QBrush(Qt::white));    painter.drawRect(0,0,rect.width()/2,rect.height());    painter.setBrush(QBrush(Qt::black));    painter.drawLine(0, 0, rect.width()/2, rect.height());    painter.drawLine(0, rect.height(), rect.width()/2, 0);    //Notice string vertical orientation in printer is negative from screen.    painter.drawText(QPointF(0,0),                     QString("%1-%2").arg(family).arg(style));    //Restores the current painter state (pops a saved state off the stack).    painter.restore();    //before begin new page.    //printer->newPage();    //after all done.    painter.end();}

备注
[1]
经测试上文中测试待打印字符串宽度的QFontMetricsF代码段是不正确的。
正确的应该参考下面的代码段,来得到在打印机上的物理宽度,奇怪的是这种方式不能得到高度。
painter.fontMetrics().width(instanceOfQString);
或 采用下面的初始化方式,能正确得到在打印机上的宽度和高度。
QFontMetricsF fm(instanceOfQFont,printer);//QPrinter*printer
fm.height()
 

1 0
原创粉丝点击