Qt 打印(基于QPrinter类)

Qt 打印(基于QPrinter类)

日期作者版本
2021年07月06日Mister HV1.0

简介

QPrinter类是一个在打印机上绘制的绘制设备。基于printsupport模块,该设备表示一系列打印输出页面,其使用方式与其他绘图设备(如QWidget和QPixmap)几乎完全相同。还提供了一组附加功能来管理特定于设备的特性,如方向和分辨率,并在生成文档时逐步浏览文档中的页面。

创建QPrinter对象

当创建一个QPrinter对象时,必须指定一个打印机工作模式,这个工作模式是一个枚举类型 enum QPrinter::PrinterMode,它基本上预设了一定的分辨率和工作模式。

常量说明
QPrinter::ScreenResolution0将打印设备的分辨率设置为屏幕分辨率。这有一个很大的优势,即在打印机上作画时得到的结果将与屏幕上的可见输出或多或少地匹配。它是最容易使用的,因为屏幕上的字体指标和打印机上的是一样的。这是默认值。
QPrinter::PrinterResolution1这个值不建议使用。它相当于Unix上的ScreenResolution和Windows和Mac上的HighResolution。由于ScreenResolution和HighResolution之间的差异,使用这个值可能会导致不可移植的打印机代码。
QPrinter::HighResolution2在Windows上,将打印机分辨率设置为为正在使用的打印机定义的分辨率。对于PDF打印,将PDF驱动程序的分辨率设置为1200dpi。

可以用下列方式来构造QPrinter对象:

QPrinter printer(QPrinter::HighResolution);

接下来就要去生成一个打印的对话框,Qt有自带的打印对话框,也是基于printsupport模块,构造打印的对话框代码如下:

QPrintDialog dialog(&printer, this);

存储内容并打印

打印对话框有了,接下来就是打印内容,下面是我以表格的方式去显示内容,我这边是借鉴网上的思路去写了一个打印(内容)QPrinterManager类,实例代码如下:
头文件:

#ifndef QPRINTERMANAGER_H
#define QPRINTERMANAGER_H

#include <QObject>
#include <QAbstractItemModel>
#include <QTextStream>
#include <QPrinter>
#include <QDebug>

class QPrinterManager : public QObject
{
    Q_OBJECT
public:
    explicit QPrinterManager(QObject *parent = nullptr);
    ~QPrinterManager(){}
    void setCharSet(const QString &set = QString("utf-8")){ m_charSet = set; }
    void dataBegin();
    void dataEnd(){ out << QString("</html>"); }
    // 添加主标题(两行:第一行居中显示文字,第二行居右显示时间)
    void insertTitle(const QString &title);
    // 添加次级标题
    void insertTitle2(const QString &title2);
    // 空出一行
    void insertSeperator(){ out << QString("<br>\n"); }
    // 不支持嵌套TABLE
    void tableBegin(const QStringList &head);
    void tableEnd(){ out << QString("</table></div>\n"); }
    void insert2TableRow(const QStringList &rowData);
    // 带预览
    void printWithPreview();
    // 直接打印,不带预览
    void printDirect();

private:
    void resetState();

private slots:
    void getPreviewData(QPrinter *printer);

private:
    QString m_charSet;
    QString m_data;
    QTextStream out;
};

#endif // QPRINTERMANAGER_H

源文件:

#include "QPrinterManager.h"
#include <QTextEdit>
#include <QPrintPreviewDialog>
#include <QPrintDialog>
#include <QTextDocument>
#include <QPrinter>
#include <QDateTime>

QPrinterManager::QPrinterManager(QObject *parent) : QObject(parent), m_charSet("utf-8")
{
    out.setString(&m_data);
}

void QPrinterManager::dataBegin()
{
    out << QString("<html>")
        << QString("<head>")
        << QString("<meta content=\"text/html; charset=%1\">").arg(m_charSet)
        << QString("<meta name=Generator content=\"Microsoft Word 12 (filtered)\">")
        << QString("</head>");
}

void QPrinterManager::insertTitle(const QString &title)
{
    out << QString("<p style='text-align:center'><span style='font-size:20.0pt;font-family:宋体'>%1</span></p>\n")
           .arg(title)
        << QString("<p style='text-align:right'><span style='font-size:18.0pt;font-family:宋体'>打印时间:%1</span></p>\n")
           .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"));
}

void QPrinterManager::insertTitle2(const QString &title2)
{
    out << QString("<p style='text-align:left'><span style='font-size:16.0pt;font-family:宋体'><b>-%1</b></span></p>\n")
           .arg(title2);
}
void QPrinterManager::tableBegin(const QStringList &head)
{
    out << QString("<div align='center' style='width:650px;margin-left:-70px;margin-top:-100px'>")
        << QString("<table class=print width=80% border=1 cellspacing=0 cellpadding=5 style=border-collapse:collapse >\n")
        << QString("<thead><tr>\n");
    for (int i = 0; i < head.count(); ++i)
    {
        //qDebug() << "i = " << i;
        out << QString("<td nowrap='nowarp' style='border:solid windowtext 2.0pt' ><p align='center'><span align='center' style='font-size:16.0pt;font-family:宋体'><b>%1</b></span></p></td>\n")
               .arg(head.at(i));
    }
    out << "</tr></thead>\n";
}

void QPrinterManager::insert2TableRow(const QStringList &rowData)
{
    out << QString("<tr>\n");
    //qDebug() << rowData.count();
    //qDebug() << rowData;
    for (int i = 0; i < rowData.count(); ++i)
    {
        out << QString("<td><p><span style='font-size:10.0pt;font-family:宋体'>%1</span></p></td>\n")
               .arg(rowData.at(i));
    }
    out << QString("</tr>\n");
}

// 带预览 打印
void QPrinterManager::printWithPreview()
{
    QPrinter printer(QPrinter::ScreenResolution);
    //由于一列的数据项数过多,将打印预览页面设置为水平
    printer.setOrientation(QPrinter::Landscape);
    //设置页边距
    printer.setPageMargins(2, 2, 6, 6, QPrinter::Millimeter);
    printer.setPageSize(QPrinter::A4);
    QPrintPreviewDialog preview(&printer);
    connect(&preview, SIGNAL(paintRequested(QPrinter*)), this, SLOT(getPreviewData(QPrinter*)));
    //preview.setWindowState(Qt::WindowNoState);
    preview.exec();
    resetState();

}

// 直接打印,不带预览
void QPrinterManager::printDirect()
{
    QPrinter printer(QPrinter::ScreenResolution);
    printer.setPageSize(QPrinter::A4);
    QPrintDialog printDialog(&printer);
    if (printDialog.exec() == QDialog::Accepted)
    {
        getPreviewData(&printer);
    }
    resetState();
}

void QPrinterManager::resetState()
{
    m_data.clear();
    m_charSet = "utf-8";
}

void QPrinterManager::getPreviewData(QPrinter *printer)
{
    QTextDocument document;
    document.setHtml(m_data);
    document.print(printer);
}

打印(内容)QPrinterManager类,函数调用过程如下:

//获取表格行数
int rowNum = ui->tableWidget->rowCount();
//打印表格的标题
QString title = QString("Student Information");
//columnList为各列名
QStringList columnList;
//dataLists为各行数据
QVector<QStringList> dataLists;
columnList<<"1"<<"2"<<"3"<<"4"<<"5"<<"6"<<"7"<<"8"<<"9"<<"10";

//表格内存储到dataLists
QString text = "";
for(int i=0;i<8;i++)
{
    QStringList data;
    for(int j=0;j<10;j++)
    {
        QTableWidgetItem* items = ui->tableWidget->item(i,j);
        text = items->text();
        data << text;
    }
    dataLists.push_back(data);
}

//声明打印(内容)QPrinterManager类,并调用其函数
QPrinterManager PM;
PM.dataBegin();
PM.insertTitle(title);
PM.insertTitle2(tr("次级标题"));
PM.tableBegin(columnList);
for(int row=0;row<rowNum;row++)
{
    PM.insert2TableRow(dataLists[row]);
}

PM.tableEnd();
PM.dataEnd();
PM.printWithPreview();
  • 2
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值