Qt生成PDF报告

文章目录


一、示意图


二、实现部分代码

cpp 复制代码
//! 生成测试报告
void MainWindow::createPdf(QString filename, _pdf_msg_& msg, const QMap<QString, int>& ok, const QMap<QString, int>& err)
{
    //
    QDir dir;
    if(!dir.exists("PdfFiles")) qDebug()<<dir.mkdir("PdfFiles");

    //创建PDF文件
    QString file_path = filename;

    QFile pdfFile(file_path);
    bool isOpen = pdfFile.open(QIODevice::WriteOnly);

    if(!isOpen)
    {
        QMessageBox::warning(this,"error", pdfFile.errorString());
        return;
    }
    QPdfWriter *pWriter = new QPdfWriter(&pdfFile);

    pWriter->setPageSize(QPagedPaintDevice::A4);
    pWriter->setResolution(300);
    pWriter->setPageMargins(QMarginsF(30, 30, 30, 30));

    QPainter *pPainter = new QPainter(pWriter);

    QFont font[5] = {QFont("宋体", 26, 60), QFont("宋体", 26, 61), QFont("宋体", 26, QFont::Normal), QFont("宋体", 26, QFont::Normal), QFont("宋体", 26, QFont::Normal)};
    font[0].setPixelSize(86);
    font[1].setPixelSize(61);
    font[2].setPixelSize(61);
    font[3].setPixelSize(42);
    font[4].setPixelSize(54);

    //qDebug()<<pPainter->viewport().width()<<" "<<pPainter->viewport().height();

    int nPDFWidth = pPainter->viewport().width();
    int nPDFHeight = pPainter->viewport().height();

    //标题
    int y = 10;
    pPainter->setFont(font[0]);

    pPainter->drawText(QRect(0, y, nPDFWidth, 100), Qt::AlignCenter, msg.title);

    //画两条横线
    y += 140;
    pPainter->setPen(QPen(QBrush(QColor(0, 0, 0)), 5));
    pPainter->drawLine(0, y, nPDFWidth, y);
    pPainter->drawLine(0, y + 18, nPDFWidth, y + 18);

    //
    y += 60;
    pPainter->setFont(font[2]);

    pPainter->drawText(QRect(100, y, nPDFWidth/2, 70), Qt::AlignVCenter | Qt::AlignLeft, QString("产品名称: %1").arg(msg.product_name));

    pPainter->drawText(QRect(nPDFWidth/2 + 100 , y, nPDFWidth/2 - 100, 70), Qt::AlignVCenter | Qt::AlignLeft, QString("产品ID: %1").arg(msg.product_id));

    y += 90;

    pPainter->drawText(QRect(100, y, nPDFWidth/2, 70), Qt::AlignVCenter | Qt::AlignLeft, QString("产品型号: %1").arg(msg.product_type));

    pPainter->drawText(QRect(nPDFWidth/2 + 100 , y, nPDFWidth/2 - 100, 70), Qt::AlignVCenter | Qt::AlignLeft, QString("测试时间: %1").arg(msg.test_time));

    //小标题
    y += 90;
    pPainter->setFont(font[1]);
    pPainter->drawText(QRect(0, y, nPDFWidth, 80), Qt::AlignVCenter | Qt::AlignLeft, "触点比较结果");
    //画表格
    y += 110;
    QStringList list;
    list<<"序号"<<"输出点位名称"<<"结果"<<"序号"<<"输出点位名称"<<"结果";
    //
    int idx = 1;
    int row  = 0;
    int column = 0;

    if(caseType == CASETYPE::L3U)
    {
        foreach(QString s, g_RelayContact_3U)
        {
            if(s == "预留") list<<QString::number(idx)<<s<<"";
            else if(err.contains(s)) list<<QString::number(idx)<<s<<"不合格";
            else if(ok.contains(s)) list<<QString::number(idx)<<s<<"合格";
            else list<<QString::number(idx)<<s<<"未检测";
            ++idx;
        }
        row = g_RelayContact_3U.length()/2+1;
        column = 6;
    }
    else
    {
        foreach(QString s, g_RelayContact_6U)
        {
            if(s == "预留") list<<QString::number(idx)<<s<<"";
            else if(err.contains(s)) list<<QString::number(idx)<<s<<"不合格";
            else if(ok.contains(s)) list<<QString::number(idx)<<s<<"合格";
            else list<<QString::number(idx)<<s<<"未检测";
            ++idx;
        }
        row = g_RelayContact_6U.length()/2+1;
        column = 6;
    }
    pdfDrawForm(pWriter, pPainter, y, 0, row, column, 80, font[3], list);


    //!//小标题
    y += 90;
    pPainter->setFont(font[1]);
    pPainter->drawText(QRect(0, y, nPDFWidth, 80), Qt::AlignVCenter | Qt::AlignLeft, "不合格点位");

    //
    //画表格
    y += 110;
    list.clear();
    list<<"序号"<<"输出点位名称"<<"结果"<<"序号"<<"输出点位名称"<<"结果";
    //
    idx = 1;
    row  = 0;
    column = 0;

    if(caseType == CASETYPE::L3U)
    {
        for(auto  it = err.begin(); it != err.end(); ++it)
        {
            list<<QString::number(it.value())<<it.key()<<"不合格";
        }

        row = err.size()/2+1;
        column = 6;
    }
    else
    {
        for(auto it = err.begin(); it != err.end(); ++it)
        {
            list<<QString::number(it.value())<<it.key()<<"不合格";
        }
        row =err.size()/2+1;
        column = 6;
    }
    pdfDrawForm(pWriter, pPainter, y, 0, row, column, 80, font[3], list);

    //
    pPainter->setFont(font[4]);
    pPainter->drawText(QRect(50, nPDFHeight, nPDFWidth/3, 80), Qt::AlignVCenter | Qt::AlignLeft, QString( "试验员: %1").arg(msg.tester_name));
    pPainter->drawText(QRect(nPDFWidth/3+50, nPDFHeight, nPDFWidth/3, 80), Qt::AlignVCenter | Qt::AlignLeft, QString( "检查员签字: "));
    pPainter->drawText(QRect(nPDFWidth/3*2, nPDFHeight, nPDFWidth/3, 80), Qt::AlignVCenter | Qt::AlignLeft, QString( "签字日期: "));

    //绘制完毕
    delete pPainter;
    delete pWriter;
    pdfFile.close();

    //通过其他PDF阅读器来打开PDF

    QDesktopServices::openUrl(QUrl::fromLocalFile(file_path));
}
cpp 复制代码
void MainWindow::pdfDrawForm(QPdfWriter *pWriter, QPainter *paint, int& y, int horzBorder, int row, int column, int unitHeight, QFont &font, QStringList &list)
{
    paint->setFont(font);

    paint->setPen(QPen(QBrush(QColor(0, 0, 0)), 2));

    int Width = paint->viewport().width() - horzBorder * 2;

    int unitWidth = Width / column;

    for(int i=0;i<row;i++) {
        int x = horzBorder;

        for(int j=0;j<column;j++) {
            paint->drawText(QRect(x, y, unitWidth, unitHeight), Qt::AlignCenter, list[i*column + j]);
            paint->drawRect(QRect(x, y, unitWidth, unitHeight));
            x += unitWidth;
        }

        y += unitHeight;
        if(y > paint->viewport().height())
        {
            pWriter->newPage();
            y = 10;
        }
    }
}

总结

记录下用到的不常用知识点
相关推荐
锦亦之22339 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
柳鲲鹏12 小时前
编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MinGW版)
开发语言·qt·mysql
三玖诶12 小时前
如何在 Qt 的 QListWidget 中逐行添加和显示数据
开发语言·qt
阳光开朗_大男孩儿18 小时前
DBUS属性原理
linux·服务器·前端·数据库·qt
Alphapeople19 小时前
Qt Modbus
开发语言·qt
竹林海中敲代码19 小时前
Qt Creator 集成开发环境 常见问题
qt·qt工具常见问题
竹林海中敲代码1 天前
Qt安卓开发连接手机调试(红米K60为例)
android·qt·智能手机
长沙红胖子Qt1 天前
关于 Qt运行加载内存较大崩溃添加扩大运行内存 的解决方法
开发语言·qt·qt扩大运行内存
gopher95111 天前
qt相关面试题
开发语言·qt·面试
三玖诶1 天前
在 Qt 中使用 QLabel 设置 GIF 动态背景
开发语言·qt·命令模式