QT tableWidget数据 生成PDF并调用外部APP实现报表及打印功能

2021-01-04 15:04:35  阅读 4632 次 评论 0 条

既然做数据库类型的软件 报表打印自然是必不可缺的,这里换个思路来实现其功能:

生成PDF文件 直接利用第三方app打开PDF来实现打印功能。

这个方法有点类似以前我们用VB生成excel文件并调用打印功能。当然调用EXCEL比较慢,这个方法就快多了


void FormAssets_brow::on_cmdPDF_clicked()
{
    QString fileName="";
    fileName= QCoreApplication::applicationDirPath();
    fileName +="/tmp.pdf";

    QFile pdfFile(fileName);
    pdfFile.open(QIODevice::WriteOnly);                 // 打开要写入的pdf文件
    QPdfWriter* pPdfWriter = new QPdfWriter(&pdfFile);  // 创建pdf写入器
    pPdfWriter->setPageSize(QPagedPaintDevice::A4);     // 设置纸张为A4
    pPdfWriter->setResolution(300);                     // 设置纸张的分辨率为300,因此其像素为3508X2479
    int iMargin = 60;                   // 页边距
    pPdfWriter->setPageMargins(QMarginsF(iMargin, iMargin, iMargin, iMargin)); //上下左右页边距
    QPainter* pPdfPainter = new QPainter(pPdfWriter);   // qt绘制工具
    // 标题,居中
    QTextOption option(Qt::AlignHCenter | Qt::AlignVCenter);
    option.setWrapMode(QTextOption::WordWrap); //字段太长自动换行
    // iTop 标题上边留白数字
    int iTop = 0;
    int lineheihgt=100; //行高
    // 文本宽度 去除页边距后盛满
    int iContentWidth = pPdfWriter->width();
    // 标题,18号字
    QFont font;
    //font.setFamily("simhei.ttf");
    font.setFamily("新宋体");
    int fontSize = 18;
    font.setPointSize(fontSize);
    pPdfPainter->setFont(font);                    // 为绘制工具设置字体
    QString str="";
    str=ui->cmbType->currentText()+" 清单";
    pPdfPainter->drawText(QRect(0, iTop, iContentWidth, 90),str, option); //打印标题
    iTop += 90;
    iTop += 10; //多留10个像素空格
    fontSize = 11;
    font.setPointSize(fontSize);
    pPdfPainter->setFont(font);
    QTextOption detailoption(Qt::AlignVCenter);
    detailoption.setWrapMode(QTextOption::WordWrap);
   //list1<<"资产类别"<<"资产名称"<<"资产ID"<<"数量"<<"单价"<<"金额"<<"资产状态"<<"使用人"<<"购买日期"<<"idd";
    int rows=ui->tableWidget1->rowCount(); //取总行数
    int cols=ui->tableWidget1->columnCount()-1; //取总列数 忽略最后一列 idd
    int colwidth=pPdfWriter->width()/cols;
    for(int i=0; i<rows; i++) // 取出每个格子的内容
    {
        // 反走样
        pPdfPainter->setRenderHint(QPainter::Antialiasing, true);
        // 设置画笔颜色
        pPdfPainter->setPen(QPen(Qt::black, 2)); //设置颜色和粗细
        // 绘制直线
        pPdfPainter->drawLine(QPointF(0, iTop), QPointF(pPdfWriter->width(), iTop) ); //表格横线
        pPdfPainter->drawLine(QPointF(0, iTop), QPointF(0, iTop+lineheihgt) );//第一根竖线
        pPdfPainter->drawLine(QPointF(pPdfWriter->width(), iTop), QPointF(pPdfWriter->width(), iTop+lineheihgt) );//最后一根竖线

        for(int j=0; j<cols; j++){
            //if(ui->tableWidget1->item(i,j) != NULL){//一定要先判断非空,否则会报错
            //QString tableText = ui->tableWidget1->item(i,j)->text();
            //qDebug() << tableText;
            pPdfPainter->drawText(QRect(colwidth*j, iTop, colwidth, lineheihgt),ui->tableWidget1->item(i,j)->text(),detailoption);
            pPdfPainter->drawLine(QPointF(colwidth*j, iTop), QPointF(colwidth*j, iTop+lineheihgt) );//竖线
            }
        iTop+=lineheihgt;
        }
    pPdfPainter->drawLine(QPointF(0, iTop), QPointF(pPdfWriter->width(), iTop) ); //最后表格横线
    pPdfPainter->setPen(QColor(0, 0, 0));
    delete pPdfPainter;
    delete pPdfWriter;
    pdfFile.close();
    //QMessageBox::warning(this,"警告",fileName);
    QDesktopServices::openUrl(QUrl::fromLocalFile(fileName)); //打开PDF文件
}

核心代码基本就这些了,以后再考虑是否增加一些内容。

初步设想是生成一个临时数组 来打印数组里的内容,那样不在调用数据库应该更快一点。

本文地址:http://jinesc.net/?id=249
免责声明:本文为原创文章,版权归 jinesc 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?