Qt打印机的使用

相关API

void QPrinter::setCopyCount(intcount);//设置打印份数

使用QT自定义的类和函数实现打印文件的功能

classNamefunction
QAbstractPrintDialogbase implementation for print dialogs used to configure printers
QPageSetupDialogconfiguration dialog for the page-related options on a printer
QPrintDialogDialog for specifying the printer’s configuration
QPrintEngineDefines an interface for how QPrinter interacts with a given printing subsystem
QPrintPreviewDialogDialog for previewing and configuring page layouts for printer output
QPrintPreviewWidgetWidget for previewing page layouts for printer output
QPrinterPaint device that paints on a printer
QPrinterInfoGives 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;
}
  
/* ---示例代码----*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值