相关API
void QPrinter::setCopyCount(intcount);//设置打印份数
使用QT自定义的类和函数实现打印文件的功能
className | function |
---|---|
QAbstractPrintDialog | base implementation for print dialogs used to configure printers |
QPageSetupDialog | configuration dialog for the page-related options on a printer |
QPrintDialog | Dialog for specifying the printer’s configuration |
QPrintEngine | Defines an interface for how QPrinter interacts with a given printing subsystem |
QPrintPreviewDialog | Dialog for previewing and configuring page layouts for printer output |
QPrintPreviewWidget | Widget for previewing page layouts for printer output |
QPrinter | Paint device that paints on a printer |
QPrinterInfo | Gives access to information about existing printers |
QT中和打印文件相关的类如下所示,它们分别是:
- 抽象文档打印对话框类,提供配置打印机的打印对话框基本实现;
- 页面设置对话框类,和打印页面相关参数的配置对话框;
- 打印对话框类,指定打印机配置的对话框;
- 打印引擎类,定义了QPrinter类如何与打印子系统交互的接口;
- 打印预览对话框类,用来预览和配置页面布局的对话框;
- 打印预览控件类,预览页面布局的控件;
- 打印机类,指示打印机如何工作。
QPrinter支持很多参数的设置,大多数的可以通过print dialog来进行修改。一般QPrinter传递这个参数给底层的QPrintEngine.
最重要的参数有:
setOrientation() tells QPrinter which page orientation to use.//页面方向
setPaperSize() tells QPrinter what paper size to expect from the printer.//纸张大小
setResolution() tells QPrinter what resolution you wish the printer to provide, in dots per inch (DPI).//分辨率
setFullPage() tells QPrinter whether you want to deal with the full page or just with the part the printer can draw on.//页面全部还是部分打印
setCopyCount() tells QPrinter how many copies of the document it should print.//设置打印份数
示例代码
- 《qt高级编程》:outputsampler
- //关键类:QPrinter QPainter
/* ---示例代码----*/
#include "myprinter.h"
#include <QFile>
#include <QPainter>
#include <QPrintPreviewDialog>
#include <QDebug>
#include <QCoreApplication>
#include <QApplication>
#include <QDesktopWidget>
#include "databaseopr.h"
MyPrinter::MyPrinter(QWidget *parent) : QWidget(parent)
{
//默认参数
m_printer.setPageMargins(15, 10, 15, 10, QPrinter::Millimeter);
m_printer.setPageSize(QPagedPaintDevice::A5);
m_printer.setPageOrientation(QPageLayout::Landscape);//纵向
m_space = 0.2;
m_itemcount = 10;
m_tatol = 1;
m_resultRow = 4;
}
void MyPrinter::printPreview()
{
QPrintPreviewDialog dialog(&m_printer, qobject_cast<QWidget *>(this->parent()));
// QSize size = qApp->desktop()->availableGeometry().size();
// dialog.resize(size);
connect(&dialog, SIGNAL(paintRequested(QPrinter*)), this, SLOT(paintPages(QPrinter*)));
dialog.exec();
}
void MyPrinter::print(QMap<QString, QString> items, QStringList result)
{
QStringList setting = DataBaseOpr::getInstance()->getPrinterSetting();
setPrinterName(setting[0]);
setFileName(setting[1]);
setResult(items, result);
// m_printer.setCopyCount(setting[3].toInt());
qDebug()<<"setting:"<<setting;
//是否打印预览
if(setting[2].contains("否")){
paintPages(&m_printer);
}else{
printPreview();
}
}
void MyPrinter::setPrinterName(QString printername)
{
m_printer.setPrinterName(printername);
}
bool MyPrinter::setFileName(QString filename)
{
QFile file(filename);
QStringList list;
if(!file.exists())
return false;
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return false;
QString string;
QTextStream in(&file);
in.setCodec("utf-8");
while (!in.atEnd()) {
string = in.readLine();
qDebug()<<string;
list.push_back(string);
}
//填充复合者和提示信息的项
int list_count = list[6].toInt() + m_itemcount;
while (list.count() < list_count) {
list.push_back(" ");
}
m_value = list;
//计算可以显示的结果行数
int count = m_value[6].toInt();
int col = m_value[7].toInt();
int row = (count + col -1)/col;
if(list[0].contains("B6")){
m_printer.setPageSize(QPagedPaintDevice::B6);
m_resultRow = 10 - row;
}
else{
m_printer.setPageSize(QPagedPaintDevice::A5);
m_resultRow = 13-row;
}
m_printer.setPageMargins(list[3].toUInt(), list[1].toUInt(), list[4].toUInt(), list[2].toUInt(), QPrinter::Millimeter);
//每次加载模板时候,那么清空item值,预览时候,清空它。
m_items.clear();
m_result.clear();
return true;
}
void MyPrinter::set(int end)
{
QMap<QString, QString> items;
QStringList result;
const int visiCount = 3*m_resultRow *end;
for(int i = 0; i<visiCount; ++i){
result.push_back("result");
}
setResult(items, result);
}
void MyPrinter::setResult(QMap<QString, QString> &items, QStringList &result)
{
m_items = items;
QStringList list;
//计算页数
int page = 1;
int tmpCount = result.count();
const int visiCount = 3*m_resultRow;
while(visiCount < tmpCount){
++page;
tmpCount = tmpCount - (3*m_resultRow);
}
m_tatol = page;
//把结果值分页;
int index = 0;
while(page){
list.clear();
if(page != 1){
for(int i = 0; i<visiCount; ++i){
list<<result[i+index];
}
}else{
for(int i = index; i<result.count(); ++i){
list<<result[i];
}
}
--page;
index += index+visiCount;
m_result.push_back(list);
}
}
void MyPrinter::paintPage(QPainter *painter, int page)
{
int y = 0;
y = paintTitle(painter);
y = paintItems(painter, y);
// m_ystart = y;
paintFooter(painter, QString("%1").arg(page+1));
//输出结果值
if(m_result.isEmpty()){
return;
}
painter->setFont(QFont("\"微软雅黑\"", 11));
QRect rect;
int w = painter->viewport().width();
int h = painter->fontMetrics().height();
int space = qRound(painter->fontMetrics().lineSpacing() * m_space);//将值四舍五入得到整数
for(int i = 0; i<m_result[page].count(); i=i+3){
rect.setRect(0*w/3, y, w/3, h);
painter->drawText(rect, m_result[page][i], QTextOption(Qt::AlignLeft));
rect.setRect(1*w/3, y, w/3, h);
painter->drawText(rect, m_result[page][1+i], QTextOption(Qt::AlignLeft));
rect.setRect(2*w/3, y, w/3, h);
painter->drawText(rect, m_result[page][2+i], QTextOption(Qt::AlignLeft));
y = y+space+h;
}
}
int MyPrinter::paintTitle(QPainter *painter)
{
painter->setFont(QFont("\"微软雅黑\"", 18));
QRect rect(0, 0, painter->viewport().width(),
painter->fontMetrics().height());
QString title = m_value[5]+tr("检验报告单");
painter->drawText(rect, title, QTextOption(Qt::AlignCenter));
return qRound(painter->fontMetrics().lineSpacing() * 1.5);//将值四舍五入得到整数
}
int MyPrinter::paintItems(QPainter *painter, int y)
{
QStringList list;
int count = m_value[6].toInt();
int col = m_value[7].toInt();
int row = (count + col -1)/col;
//处理item
for(int i = 0; i<count; ++i){
list.push_back(appendItem(m_value[i+8]));
}
qDebug()<<list;
painter->setFont(QFont("\"微软雅黑\"", 11));
QRect rect;
int w = painter->viewport().width();
int h = painter->fontMetrics().height();
int space = qRound(painter->fontMetrics().lineSpacing() * m_space);//将值四舍五入得到整数
//写患者和项目信息;
int num = 0;
for(int r = 0; r<row; ++r){
for(int c = 0; c<col; ++c){
rect.setRect(c*w/col, y+r*(h+space), w/col, h);
painter->drawText(rect, list[num++], QTextOption(Qt::AlignLeft));
//当一行填写不完整时候
if(num >= count)
break;
}
}
y = y+row*(h+space);
//画线
painter->drawLine(0, y, w, y);
y += space;
painter->drawLine(0, y, w, y);
y += space;
rect.setRect(0*w/3, y, w/3, h);
painter->drawText(rect, tr("项目"), QTextOption(Qt::AlignLeft));
rect.setRect(1*w/3, y, w/3, h);
painter->drawText(rect, tr("检验结果"), QTextOption(Qt::AlignLeft));
rect.setRect(2*w/3, y, w/3, h);
painter->drawText(rect, tr("参考值"), QTextOption(Qt::AlignLeft));
y += space+h;
painter->drawLine(0, y, w, y);
return y + space;
}
int MyPrinter::paintResult(QPainter *painter, int y, QStringList record)
{
painter->setFont(QFont("\"微软雅黑\"", 11));
QRect rect;
int w = painter->viewport().width();
int h = painter->fontMetrics().height();
int space = qRound(painter->fontMetrics().lineSpacing() * m_space);//将值四舍五入得到整数
rect.setRect(0*w/3, y, w/3, h);
painter->drawText(rect, record[0], QTextOption(Qt::AlignLeft));
rect.setRect(1*w/3, y, w/3, h);
painter->drawText(rect, record[1], QTextOption(Qt::AlignLeft));
rect.setRect(2*w/3, y, w/3, h);
painter->drawText(rect, record[2], QTextOption(Qt::AlignLeft));
return y+space+h;
}
int MyPrinter::paintFooter(QPainter *painter, QString page)
{
painter->setFont(QFont("\"微软雅黑\"", 11));
int w = painter->viewport().width();
int y = painter->viewport().height();
int h = painter->fontMetrics().height();
int space = qRound(painter->fontMetrics().lineSpacing() * m_space);//将值四舍五入得到整数
// 1/1
QRect rect;
rect.setRect(0, y-h, painter->viewport().width(),
painter->fontMetrics().height());
QString title = page+"/"+QString("%1").arg(m_tatol);
painter->drawText(rect, title, QTextOption(Qt::AlignCenter));
//本结果xxxx
y = y- h-h-space;
rect.setRect(0, y, painter->viewport().width(),
painter->fontMetrics().height());
painter->drawText(rect, m_value[m_value.count()-2], QTextOption(Qt::AlignLeft));
//xxx者
y = y-h-space;
QString info;
info = appendItem(tr("送检者"));
rect.setRect(0*w/3, y, w/3, h);
painter->drawText(rect, info, QTextOption(Qt::AlignLeft));
info = appendItem(tr("检验者"));
rect.setRect(1*w/3, y, w/3, h);
painter->drawText(rect, info, QTextOption(Qt::AlignLeft));
info = "复核者:"+m_value[m_value.count()-1];
rect.setRect(2*w/3, y, w/3, h);
painter->drawText(rect, info, QTextOption(Qt::AlignLeft));
y = y-space;
painter->drawLine(0, y, w, y);
y -= space;
painter->drawLine(0, y, w, y);
y -= space;
return y;//将值四舍五入得到整数
}
QString MyPrinter::appendItem(QString item)
{
if(m_items.contains(item))
item = item+":"+m_items[item];
else
item = item+":";
return item;
}
bool MyPrinter::paintPages(QPrinter *printer)
{
QPainter painter;
if(!painter.begin(printer)){
return false;
}
for(int page = 0; page < m_tatol; ++page){
paintPage(&painter, page);
if(page+1 < m_tatol)
printer->newPage();
}
painter.end();
return true;
}
/* ---示例代码----*/