一、在配置文件中添加打印模块
QT += printsupport
二、打印封装
PrintAPI.h
#ifndef PRINTAPI_H
#define PRINTAPI_H
#include <QObject>
#include <QMutex>
#include <QStringList>
#include <QtPrintSupport/QPrinter>
class PrintAPI : public QObject
{
Q_OBJECT
private:
explicit PrintAPI(QObject *parent = 0);
static PrintAPI *_instance;
QStringList html;
public:
static PrintAPI *Instance() {
static QMutex mutex;
if (!_instance) {
QMutexLocker locker(&mutex);
if (!_instance) {
_instance = new PrintAPI;
}
}
return _instance;
}
void PrintA4(QString title, QString subTitle,
QList<QString> columnNames, QList<int> columnWidths,
QStringList content, bool landscape, bool check,
QPrinter::PageSize pageSize = QPrinter::A4);
void PrintA4(QString title, QList<QString> columnNames, QList<int> columnWidths,
QStringList subTitle1, QStringList subTitle2,
QStringList content, bool landscape, bool check,
QPrinter::PageSize pageSize = QPrinter::A4);
signals:
private slots:
void printView(QPrinter *printer);
};
#endif
PrintAPI.cpp
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif
#include "printapi.h"
#include <QtPrintSupport/QPrintPreviewDialog>
#include <QApplication>
#include <QDesktopWidget>
#include <QTextDocument>
PrintAPI *PrintAPI::_instance = 0;
PrintAPI::PrintAPI(QObject *parent) :
QObject(parent)
{
}
void PrintAPI::PrintA4(QString title, QString subTitle, QList<QString> columnNames,
QList<int> columnWidths, QStringList content, bool landscape, bool check,
QPrinter::PageSize pageSize)
{
int columnCount = columnNames.count();
int rowCount = content.count();
html.clear();
html.append("<table border='0.5' cellspacing='0' cellpadding='3'>");
if (title.length() > 0) {
html.append(QString("<tr><td align='center' style='vertical-align:middle;font-weight:bold;' colspan='%1'>")
.arg(columnCount));
html.append(title);
html.append("</td></tr>");
}
if (subTitle.length() > 0) {
html.append(QString("<tr><td align='left' style='vertical-align:middle;' colspan='%1'>")
.arg(columnCount));
html.append(subTitle);
html.append("</td></tr>");
}
if (columnCount > 0) {
html.append("<tr>");
for (int i = 0; i < columnCount; i++) {
html.append(QString("<td width='%1' bgcolor='lightgray' align='center' style='vertical-align:middle;'>")
.arg(columnWidths.at(i)));
html.append(columnNames.at(i));
html.append("</td>");
}
html.append("</tr>");
}
for (int i = 0; i < rowCount; i++) {
QStringList value = content.at(i).split(";");
html.append("<tr>");
if (check) {
if (value.at(value.count() - 1) == "历史记录") {
for (int j = 0; j < columnCount; j++) {
html.append(QString("<td width='%1' align='center' style='vertical-align:middle;'>"
"<font color='red'>").arg(columnWidths.at(j)));
html.append(value.at(j));
html.append("</font></td>");
}
} else {
for (int j = 0; j < columnCount; j++) {
html.append(QString("<td width='%1' align='center' style='vertical-align:middle;'>")
.arg(columnWidths.at(j)));
html.append(value.at(j));
html.append("</td>");
}
}
} else {
for (int j = 0; j < columnCount; j++) {
html.append(QString("<td width='%1' align='center' style='vertical-align:middle;'>")
.arg(columnWidths.at(j)));
html.append(value.at(j));
html.append("</td>");
}
}
html.append("</tr>");
}
html.append("</table>");
QPrinter printer;
printer.setOutputFormat(QPrinter::NativeFormat);
printer.setPageSize(pageSize);
if (landscape) {
printer.setOrientation(QPrinter::Landscape);
printer.setPageMargins(10, 10, 10, 12, QPrinter::Millimeter);
} else {
printer.setOrientation(QPrinter::Portrait);
printer.setPageMargins(10, 10, 10, 16, QPrinter::Millimeter);
}
QPrintPreviewDialog preview(&printer);
preview.setWindowTitle("打印预览");
connect(&preview, SIGNAL(paintRequested(QPrinter *)), this, SLOT(printView(QPrinter *)));
preview.setGeometry(qApp->desktop()->availableGeometry());
preview.exec();
}
void PrintAPI::PrintA4(QString title, QList<QString> columnNames, QList<int> columnWidths,
QStringList subTitle1, QStringList subTitle2,
QStringList content, bool landscape, bool check,
QPrinter::PageSize pageSize)
{
int columnCount = columnNames.count();
html.clear();
html.append("<table border='0.5' cellspacing='0' cellpadding='3'>");
if (title.length() > 0) {
html.append(QString("<tr><td align='center' style='vertical-align:middle;font-weight:bold;' colspan='%1'>")
.arg(columnCount));
html.append(title);
html.append("</td></tr>");
}
int count = content.count();
for (int i = 0; i < count; i++) {
html.append(QString("<tr><td colspan='%1'>").arg(columnCount));
html.append("</td></tr>");
if (subTitle1.count() > 0 && subTitle1.count() > i) {
if (subTitle1.at(i).length() > 0) {
html.append(QString("<tr><td align='left' style='vertical-align:middle;' colspan='%1'>")
.arg(columnCount));
html.append(subTitle1.at(i));
html.append("</td></tr>");
}
}
if (subTitle2.count() > 0 && subTitle2.count() > i) {
if (subTitle2.at(i).length() > 0) {
html.append(QString("<tr><td align='left' style='vertical-align:middle;' colspan='%1'>")
.arg(columnCount));
html.append(subTitle2.at(i));
html.append("</td></tr>");
}
}
if (columnCount > 0) {
html.append("<tr>");
for (int i = 0; i < columnCount; i++) {
html.append(QString("<td width='%1' bgcolor='lightgray' align='center' style='vertical-align:middle;'>")
.arg(columnWidths.at(i)));
html.append(columnNames.at(i));
html.append("</td>");
}
html.append("</tr>");
}
QStringList list = content.at(i).split(";");
int rowCount = list.count();
for (int j = 0; j < rowCount; j++) {
html.append("<tr>");
QString temp = list.at(j);
QStringList value = temp.split("|");
int valueCount = value.count();
if (check) {
if (value.at(valueCount - 1) == "1") {
for (int k = 0; k < valueCount - 1; k++) {
html.append(QString("<td width='%1' align='center' style='vertical-align:middle;'>"
"<font color='red'>").arg(columnWidths.at(k)));
html.append(value.at(k));
html.append("</font></td>");
}
} else {
for (int k = 0; k < valueCount - 1; k++) {
html.append(QString("<td width='%1' align='center' style='vertical-align:middle;'>")
.arg(columnWidths.at(k)));
html.append(value.at(k));
html.append("</td>");
}
}
} else {
for (int k = 0; k < valueCount; k++) {
html.append(QString("<td width='%1' align='center' style='vertical-align:middle;'>")
.arg(columnWidths.at(k)));
html.append(value.at(k));
html.append("</td>");
}
}
html.append("</tr>");
}
}
html.append("</table>");
QPrinter printer;
printer.setOutputFormat(QPrinter::NativeFormat);
printer.setPageSize(pageSize);
if (landscape) {
printer.setOrientation(QPrinter::Landscape);
printer.setPageMargins(10, 10, 10, 12, QPrinter::Millimeter);
} else {
printer.setOrientation(QPrinter::Portrait);
printer.setPageMargins(10, 10, 10, 16, QPrinter::Millimeter);
}
QPrintPreviewDialog preview(&printer);
preview.setWindowTitle("打印预览");
connect(&preview, SIGNAL(paintRequested(QPrinter *)), this, SLOT(printView(QPrinter *)));
preview.setGeometry(qApp->desktop()->availableGeometry());
preview.exec();
}
void PrintAPI::printView(QPrinter *printer)
{
QTextDocument txt;
txt.setHtml(html.join(""));
txt.print(printer);
}
使用案例
void Dialog::on_pushButton_clicked()
{
#ifdef __arm__
myHelper::ShowMessageBoxError("未安装打印机!");
return;
#endif
QString type = "所有告警记录";
QList<QString> columnNames;
columnNames.append("列1");
columnNames.append("列2");
columnNames.append("列3");
columnNames.append("列4");
columnNames.append("列5");
QList<int> columnWidths;
columnWidths.append(150);
columnWidths.append(120);
columnWidths.append(180);
columnWidths.append(100);
columnWidths.append(150);
QStringList content;
content.append("值1-1;值1-2;值1-3;值1-4;值1-5");
content.append("值2-1;值2-2;值2-3;值2-4;值2-5");
content.append("值3-1;值3-2;值3-3;值3-4;值3-5");
content.append("值4-1;值4-2;值4-3;值4-4;值4-5");
content.append("值5-1;值5-2;值5-3;值5-4;值5-5");
PrintAPI::Instance()->PrintA4(type, "", columnNames, columnWidths, content, true, false);
}