Qt 生成pdf文件

该博客详细介绍了如何使用Qt库中的QPdfWriter和QPainter类来创建和绘制PDF文件,包括设置页面大小、分辨率、边距,添加文字、表格、线条、图片以及绘制表格和签名等操作,最后通过QDesktopServices打开生成的PDF文档供查看。
摘要由CSDN通过智能技术生成

运行效果:

代码:

 

#include <QPdfWriter>
#include <QPainter>
#include <QDesktopServices>

void Widget::on_pushButton_5_clicked()
{
    //创建PDF文件
    QString file_path = QApplication::applicationDirPath() + "/text.pdf";

    QFile pdfFile(file_path);
    pdfFile.open(QIODevice::WriteOnly);
    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, QString("这是第一个PDF文档"));
    //画两条横线
    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("器件型号: YT-CR810"));
    pPainter->setFont(font[2]);
    pPainter->drawText(QRect(nPDFWidth/2 + 100 , y, nPDFWidth/2 - 100, 70), Qt::AlignVCenter | Qt::AlignLeft, QString("器件编号: YT-CR810"));

    y += 90;
    pPainter->setFont(font[2]);
    pPainter->drawText(QRect(100, y, nPDFWidth/2, 70), Qt::AlignVCenter | Qt::AlignLeft, QString("装车车号: YT-CR810"));
    pPainter->setFont(font[2]);
    pPainter->drawText(QRect(nPDFWidth/2 + 100 , y, nPDFWidth/2 - 100, 70), Qt::AlignVCenter | Qt::AlignLeft, QString("实验日期: YT-CR810"));
    //小标题
    y += 110;
    pPainter->setFont(font[1]);
    pPainter->drawText(QRect(0, y, nPDFWidth, 80), Qt::AlignVCenter | Qt::AlignLeft, "减 振 器 标 准 参 数");
    //画表格
    y += 120;
    QStringList list;
    list<<"速度"<<"压力"<<"拉力"<<"阻尼系数"<<"不对称率"<<"正允差"<<"负允差";
    list<<"12.5m/s"<<"17KN"<<"15KN"<<"1.3kNs/m"<<"12%"<<"13%"<<"14%";
    pdfDrawForm(pPainter, y, 0, 2, 7, 100, font[3], list);

    y += 260;
    pPainter->setFont(font[1]);
    pPainter->drawText(QRect(0, y, nPDFWidth, 80), Qt::AlignVCenter | Qt::AlignLeft, "示功图");
    //插入图片
    y += 100;
    int imageBorder = 150;
    QPixmap pixmap = QPixmap::grabWidget(this, this->rect());
    float x = (float)(nPDFWidth - imageBorder * 2) / (float)pixmap.width();
    pixmap = pixmap.scaled(nPDFWidth - imageBorder * 2, x * pixmap.height(), Qt::IgnoreAspectRatio);
    pPainter->drawPixmap(imageBorder, y, pixmap);

    y += pixmap.height() + 90;
    pPainter->setFont(font[1]);
    pPainter->drawText(QRect(0, y, nPDFWidth, 80), Qt::AlignVCenter | Qt::AlignLeft, "减 震 器 测 试 结 果");

    y += 120;
    list.clear();
    list<<"拉伸行程"<<"0.00mm"<<"压缩行程"<<"0.00mm"<<"最大速度"<<"0.000m/s"<<"阻尼系数"<<"0.00kNs/m"
       <<"最大压力"<<"0.00kN"<<"压力偏差"<<"0.00%"<<"最大拉力"<<"0.00kN"<<"拉力偏差"<<"0.00%"
      <<"不对称率"<<"0.00%"<<"运动时间"<<"5S"<<"实验结果"<<"100%"<<"曲线结论"<<"100";
    pdfDrawForm(pPainter, y, 0, 3, 8, 100, font[3], list);

    pPainter->setFont(font[4]);
    pPainter->drawText(QRect(50, nPDFHeight, nPDFWidth/3, 80), Qt::AlignVCenter | Qt::AlignLeft, QString( "试验员: 张三"));
    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));
}

void Widget::pdfDrawForm(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;
    }
}

 

Qt是一个跨平台的应用程序开发框架,用于开发GUI软件,它支持多种数据格式的处理。TDMS是一种二进制文件格式,该格式旨在更有效地存储和传输大量数据,常用于高速数据采集,测试和测量领域。本文将介绍如何在Qt生成TDMS文件。 首先,需要使用NI提供的TDMS C库。其次,需要使用Qt文件IO类实现TDMS文件生成文件IO类是Qt中用于处理文件和目录的类,可以用于读取和写入文件。 在生成TDMS文件之前,需要明确TDMS文件的结构。TDMS文件包含了通道组,通道和数据信息。通道组是一个文件中的顶级数据组,通道是通道组中的子项,数据是存储在通道中的数据。 利用Qt文件IO类,可以实现如下代码: ``` #include <QFile> #include <QDataStream> 文件名称:QString tdmsName = "test.tdms"; 通道组名称:QString rootName = "测试"; 通道名称:QString channelName = "通道1"; //创建文件对象 QFile tdmsFile(tdmsName); //判断文件是否存在 if (!tdmsFile.exists()) { //文件不存在则创建文件 tdmsFile.open(QIODevice::WriteOnly); tdmsFile.close(); } // 打开文件 if (!tdmsFile.open(QIODevice::ReadWrite)) { return; } // 创建数据流 QDataStream out(&tdmsFile); // 写入通道组信息 out << static_cast<quint8>(1); //TDMS 文件版本号 out << quint64(2); //文件头大小 out << QString("TDMS"); //文件头标志 out << static_cast<quint8>(1); //通道组数量 out << static_cast<quint16>(rootName.size()); //通道组名称长度 out.writeRawData(rootName.constData(), rootName.size()); // 通道组名称 // 写入通道信息 out << static_cast<quint32>(1); //通道数量 out << static_cast<quint16>(channelName.size()); //通道名称长度 out.writeRawData(channelName.constData(), channelName.size()); //通道名称 // 写入数据 float data[] = {1.23, 2.34, 3.45}; quint32 dataSize = sizeof(data); out << quint32(0x2015C001); //数据类型 TDMS_TYPE_FLOAT64, TDMS_TYPE_FLOAT32, TDMS_TYPE_INT8等 out << quint32(dataSize); //数据大小 out.writeRawData(reinterpret_cast<const char *>(data), dataSize); ``` 通过上述代码可以实现TDMS文件生成文件包含一个通道组,一个通道和一组数据。实际应用中,需要根据数据类型和数据大小通过数据流写入文件。 总结起来,Qt生成TDMS文件需要使用NI提供的TDMS C库和Qt文件IO类。在文件中写入通道组、通道和数据信息,即可生成TDMS文件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值