QT笔记-生成PDF文件(附带完整源码)绘制表格和文字

2023-11-16

项目链接:https://download.csdn.net/download/C_panpan/88268845 icon-default.png?t=N7T8https://download.csdn.net/download/C_panpan/88268845

//.h
public:
	void exportPdf();
    void paintPdf(QPagedPaintDevice *device);

//.cpp
void pdfDemo::exportPdf()
{
	//一、选择保存pdf文件路径
	QString sPath = QFileDialog::getSaveFileName(this, tr("save as"), "/", tr("Text Files (*.pdf)"));
	if (sPath.isEmpty())
	{
		return;
	}
	qDebug() << sPath;

	//二、创建pdf文件
	QFile pdfFile(sPath);
	pdfFile.open(QIODevice::WriteOnly);

	//三、创建生成pdf类,作为绘图设备
	QPdfWriter *pPdfWriter = new QPdfWriter(&pdfFile);
	pPdfWriter->setResolution(300);
	pPdfWriter->setPageOrientation(QPageLayout::Landscape);//设置页面方向:QPageLayout::Portrait 纵向、QPageLayout::Landscape 横向
	pPdfWriter->setPageSize(QPagedPaintDevice::A4);
	pPdfWriter->setPageMargins(QMarginsF(30, 30, 30, 30));

	//四、开始绘制PDF
	paintPdf(pPdfWriter);

	delete pPdfWriter;
	pdfFile.close();

	//通过其它PDF阅读器来打开刚刚绘制的PDF
	QDesktopServices::openUrl(QUrl::fromLocalFile(sPath));
}

void pdfDemo::paintPdf(QPagedPaintDevice *device)
{
	QPainter *pPainter = new QPainter(device);
	qDebug() << pPainter->viewport();
	int nPdfWidth = pPainter->viewport().width();
	int nPdfHeight = pPainter->viewport().height();

	//绘制标题
	int y = 10;
	pPainter->setFont(QFont(GBK::ToUnicode("宋体"), 18, 36));
	pPainter->drawText(QRect(0, y, nPdfWidth, 100), Qt::AlignCenter, GBK::ToUnicode("出库单"));

	//绘制表格
	pPainter->setRenderHint(QPainter::Antialiasing, true);// 反走样
	pPainter->setPen(QPen(QBrush(QColor(144, 166, 188)), 3));// 设置画笔颜色、宽度
	pPainter->drawRect(50, 200, 3156, 1800);//绘制矩形
	pPainter->drawLine(QLineF(50, 400, 3206, 400));//绘制直线
	pPainter->drawLine(QLineF(50, 600, 3206, 600));//绘制直线
	pPainter->drawLine(QLineF(50, 800, 3206, 800));//绘制直线
	pPainter->drawLine(QLineF(50, 1000, 3206, 1000));//绘制直线
	pPainter->drawLine(QLineF(50, 1200, 3206, 1200));//绘制直线
	pPainter->drawLine(QLineF(50, 1400, 3206, 1400));//绘制直线
	pPainter->drawLine(QLineF(50, 1600, 3206, 1600));//绘制直线
	pPainter->drawLine(QLineF(50, 1800, 3206, 1800));//绘制直线
	pPainter->drawLine(QLineF(300, 200, 300, 2000));//绘制直线
	pPainter->drawLine(QLineF(1200, 200, 1200, 2000));//绘制直线
	pPainter->drawLine(QLineF(1500, 200, 1500, 2000));//绘制直线
	pPainter->drawLine(QLineF(1900, 200, 1900, 2000));//绘制直线
	pPainter->drawLine(QLineF(2300, 200, 2300, 2000));//绘制直线
	pPainter->drawLine(QLineF(2700, 200, 2700, 2000));//绘制直线

	//绘制报告相关信息
	pPainter->setFont(QFont(GBK::ToUnicode("宋体"), 12, 20));
	pPainter->drawText(QRect(50, 200, 200, 200), Qt::AlignHCenter | Qt::AlignVCenter, GBK::ToUnicode("编号"));
	pPainter->drawText(QRect(300, 200, 900, 200), Qt::AlignHCenter | Qt::AlignVCenter, GBK::ToUnicode("名称及规格"));
	pPainter->drawText(QRect(1200, 200, 300, 200), Qt::AlignHCenter | Qt::AlignVCenter, GBK::ToUnicode("单位"));
	pPainter->drawText(QRect(1500, 200, 400, 200), Qt::AlignHCenter | Qt::AlignVCenter, GBK::ToUnicode("数量"));
	pPainter->drawText(QRect(1900, 200, 400, 200), Qt::AlignHCenter | Qt::AlignVCenter, GBK::ToUnicode("单价"));
	pPainter->drawText(QRect(2300, 200, 400, 200), Qt::AlignHCenter | Qt::AlignVCenter, GBK::ToUnicode("金额"));
	pPainter->drawText(QRect(2700, 200, 400, 200), Qt::AlignHCenter | Qt::AlignVCenter, GBK::ToUnicode("备注"));

	delete pPainter;
}

运行效果

绘制效果2:

void pdfDemo::paintPdf(QPagedPaintDevice *device)
{
    QPainter *pPainter = new QPainter(device);
	qDebug() << pPainter->viewport();
	int nPdfWidth = pPainter->viewport().width();
	int nPdfHeight = pPainter->viewport().height();

	//绘制标题
	int y = 10;
	pPainter->setFont(QFont(GBK::ToUnicode("宋体"), 18, 36));
	pPainter->drawText(QRect(0, y, nPdfWidth, 100), Qt::AlignCenter, GBK::ToUnicode("实验操作记录报告"));

	//绘制报告相关信息
	y += 200;
	pPainter->setFont(QFont(GBK::ToUnicode("宋体"), 12, 20));
	int nLineSpace = 100;
	int nLineHeight = 60;
	pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, GBK::ToUnicode("实验编号:19990926001"));
	y += nLineSpace;
	pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, GBK::ToUnicode("操作仪器:TMachine9568"));
	y += nLineSpace;
	pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, GBK::ToUnicode("操作用户:Dr.Miss"));
	y += nLineSpace;
	pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, GBK::ToUnicode("开始时间:1999-09-26 17:50"));
	y += nLineSpace;
	pPainter->drawText(QRect(100, y, nPdfWidth, nLineHeight), Qt::AlignLeft, GBK::ToUnicode("结束时间:1999-09-26 22:30"));

	//绘制每个操作记录的各项标题 (标题宽的比例为 序号:操作时间:操作说明:试管和试剂信息 = 2:5:5:10)
	y += 150;
	pPainter->setFont(QFont(GBK::ToUnicode("宋体"), 14, 28));
	int nUnitW = nPdfWidth / (2 + 5 + 5 + 10);

	int nNoWidth = nUnitW * 2;

	int nTimeX = nNoWidth;
	int nTimeWidth = nUnitW * 5;

	int nExplainX = nTimeX + nTimeWidth;
	int nExplainWidth = nUnitW * 5;

	int nRgInfoX = nExplainX + nExplainWidth;
	int nRgInfoW = nUnitW * 10;

	nLineHeight = 80;
	pPainter->drawText(QRect(0, y, nNoWidth, nLineHeight), Qt::AlignCenter, GBK::ToUnicode("序号"));
	pPainter->drawText(QRect(nTimeX, y, nTimeWidth, nLineHeight), Qt::AlignCenter, GBK::ToUnicode("操作时间"));
	pPainter->drawText(QRect(nExplainX, y, nExplainWidth, nLineHeight), Qt::AlignCenter, GBK::ToUnicode("操作说明"));
	pPainter->drawText(QRect(nRgInfoX, y, nRgInfoW, nLineHeight), Qt::AlignCenter, GBK::ToUnicode("试管和试剂信息"));

	//绘制一条分隔线
	y += 100;
	pPainter->setPen(QPen(QBrush(QColor(144, 166, 188)), 8));
	pPainter->drawLine(QLineF(0, y, nPdfWidth, y));

	//绘制染色操作记录,假设此刻有25条记录需要绘制
	for (int i = 0; i < 20; ++i)
	{
		//判断是否应该另起一页(320:根据计算,绘制每条记录大概需要320点)
		if (y + 320 >= nPdfHeight)
		{
			device->newPage();
			y = 10;
		}

		y += 50;
		pPainter->setFont(QFont(GBK::ToUnicode("宋体"), 12, 20));
		pPainter->setPen(QPen(QBrush(QColor(0, 0, 0)), 1));

		nLineSpace = 80;
		nLineHeight = 50;

		pPainter->drawText(QRect(0, y, nNoWidth, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, QString("%1").arg(i + 1));
		pPainter->drawText(QRect(nTimeX, y, nTimeWidth, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, GBK::ToUnicode("1999-09-26 18:27"));
		pPainter->drawText(QRect(nExplainX, y, nExplainWidth, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft, GBK::ToUnicode("需加试剂DC9混合"));

		//试管和试剂信息的每行需列出2项信息 宽度比例为7:3
		nUnitW = nRgInfoW / (7 + 3);

		int nLeftX = nRgInfoX;
		int nLeftW = nUnitW * 6;

		int nRightX = nLeftX + nLeftW;
		int nRightW = nUnitW * 4;

		pPainter->drawText(QRect(nLeftX, y, nLeftW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft,
			GBK::ToUnicode("试管ID:15bb00226fa"));
		pPainter->drawText(QRect(nRightX, y, nRightW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft,
			GBK::ToUnicode("试管位置号:18"));

		y += nLineSpace;
		pPainter->drawText(QRect(nLeftX, y, nLeftW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft,
			GBK::ToUnicode("添加试剂1:AC856"));
		pPainter->drawText(QRect(nRightX, y, nRightW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft,
			GBK::ToUnicode("添加量:150"));

		y += nLineSpace;
		pPainter->drawText(QRect(nLeftX, y, nLeftW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft,
			GBK::ToUnicode("添加试剂2:SFH51"));
		pPainter->drawText(QRect(nRightX, y, nRightW, nLineHeight), Qt::AlignVCenter | Qt::AlignLeft,
			GBK::ToUnicode("添加量:80"));

		y += 70;
		pPainter->setPen(QPen(QBrush(QColor(166, 188, 222)), 3));
		pPainter->drawLine(QLineF(0, y, nPdfWidth, y));
		if (i > 0 && i < 19 && y < 1970)
			pPainter->drawLine(QLineF(220, y, 220, y + 200));
	}

	delete pPainter;
}

 运行效果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT笔记-生成PDF文件(附带完整源码)绘制表格和文字 的相关文章

  • 如何从键盘为 QTableWidget 创建信号?

    我有一张桌子 可以通过左 右 上 下按钮在里面移动 现在 当我停留在某个单元格并按空格键时 我需要创建一个信号 该信号还应该带来该单元格的坐标 我尝试使用 QTableWidget 的标准信号 但它不起作用 我该如何解决这个问题 创建一个单
  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • 我如何告诉 QTableWidget 结束编辑单元格?

    我正在显示一个弹出菜单来选择 QTableWidget 中的某些值 最下面的项目是 修改列表 条目 当我选择它时 应自动出现一个新窗口 并且 QComboBox 应消失 并且单元格返回到 Qt DisplayRole 状态 现在 Qt 拥有
  • Wkhtmltopdf 每页右侧的垂直文本

    下面是使用 wkhtmltopdf 生成的 PDF 示例 我需要在每一页的右书脊上生成文本 我尝试将其添加到标题代码中 似乎会剪辑 PDF 的正文 我正在使用 wkhtmltopdf 的页眉和页脚参数 不太确定如何或是否可以在每个页面的右侧
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • PyQt:使用 alpha 通道创建 QPixmap,而不是预乘颜色通道

    我想创建一个 QPixmap 来使用 QPainter 进行绘制 QPixmap 应支持透明度 而不使用预乘颜色通道 目前 我通过创建具有所需尺寸的 QPixmap 并用每个通道 包括 alpha 设置为零的 QColor 填充它来实现此目
  • 带有嵌入 Flash 视频的 PDF 示例?

    有谁知道我在哪里可以查看嵌入 Flash 视频的 PDF 示例 我知道问这个问题很愚蠢 因为你会认为任何面向技术的用户都应该能够使用谷歌找到一个 但我真的找不到 我的另一个问题是 使用 C 中的 API 将 Flash 视频嵌入 PDF 文
  • 渲染具有透明度的纹理时,OpenGL 不需要的像素

    我已经为这个问题苦苦挣扎了一段时间了 当我使用 OpenGL 渲染 2D 纹理 在无透明度和部分透明度之间的过渡上具有透明度值 时 我得到了一些烦人的灰色像素 我认为这是像素值插值的产物 关于如何改进这一点有什么想法吗 I m attach
  • 在 Android 中使用 iText 读取或打开 PDF 文件

    我是 Android 应用程序开发新手 使用 iText 我完成了 PDF 创建并在创建的文件上写入 现在我想阅读该 PDF 文件 如何使用 iText 打开或阅读 PDF 文件 例子将是可观的 那么提前 哪个是渲染 PDF 文件的最佳库
  • 如何改善 Qt5 程序的启动时间?

    我最近切换到 Qt5 我注意到与 Qt4 相比 初始化 QApplication 花费的时间明显更长 大约几分钟 仔细一看 程序似乎把时间花在了这里 Qt5Guid dll QGlobalStatic
  • 数字签名(PKCS#7 - 延迟签名)/自应用签名以来文档已被更改或损坏

    我已经浏览了所有类似的问题 但找不到应用 itextsharp 延迟签名的情况 基本上 我的应用程序使用以下方式签署 pdf 文档PKCS 7由远程 Web 服务创建的签名 我的应用程序向此 Web 服务发送原始文档的哈希值 添加空签名字段
  • 将元数据添加到 PDF

    我需要将元数据添加到我正在创建的 PDF 中prawn http rubygems org gems prawn 该元数据稍后可能会被提取 pdf阅读器 http rubygems org gems pdf reader 该元数据将包含内部
  • PDFcropbox中的坐标指的是什么尺寸?

    例如 如果一个 pdf 指定了错误的页面大小 则可以使用以下命令裁剪掉文档中不需要的部分 鬼脚本 questions tagged ghostscript和命令参数 CropBox 我的问题是 命令中的数字指的是什么 我知道它们是点单位 一
  • 从 Windows 命令行打印 PDF

    我正在尝试打印当前目录中的所有 pdf 文件 当我在 cmd 中调用这个 bash 脚本时 singlepdf sh C Program Files x86 Adobe Reader 10 0 Reader AcroRd32 exe t G
  • 禁用右键单击嵌入元素内的 pdf

    我有一个embed我在其中提供路径的元素pdf文件 我想阻止它被下载 但是当我右键单击该 t 时 我会看到保存和打印 pdf 的选项 我想阻止这些选项 I tried 但它禁用除 PDF 之外的整个页面上的右键单击 一种不受 CORS 或
  • 关于在 Qt 中使用未记录的类

    使用无证文件是否安全QObjectUserData类和QObject setUserData in Qt 相反 你可以看看使用QObject setProperty http doc qt io qt 5 qobject html setP
  • Android 中的列表视图到 pdf

    我有一个自定义列表视图 我想从整个列表视图制作pdf 我参考了很多帖子并实现了下面的代码 该代码将我的列表视图转pdf 但问题是它不包含整个列表视图项目 pdf 中仅提供前几项 我的转换函数列表视图转pdf is fab setOnClic
  • 使用 JavaScript 填写 PDF 表单

    这就是我所拥有的 用户填写很长的 html 表单 用户获取下载不同 pdf 的链接 这是可填写的表格 链接是使用 javascript 生成的 用户单击链接 生成 url 使用用户之前提交的数据 在表单中处理数据并完成字段 这是在表单内使用
  • 在 4K 屏幕上使用 Matplotlib 和 TKAgg 或 Qt5Agg 后端

    我在 Ubuntu 16 04 上使用 Matplotlib 2 0 和 Python 3 6 来创建数据图 电脑显示器的分辨率为 4k 分辨率为 3840x2160 绘图数字看起来非常小 字体也很小 我已经尝试过TKAgg and Qt5
  • 带 Qt 的菜单栏/系统托盘应用程序

    我是 Qt PyQt 的新手 我正在尝试制作一个应用程序 其功能将从菜单栏 系统托盘执行 这里展示了一个完美的例子 我找不到关于如何做到这一点的好资源 有人可以建议吗 Thanks 我认为您正在寻找与QMenu and QMainWindo

随机推荐

  • C++之string赋值

    string s string a abcdefg 1 将字符串a的元素赋值逐一赋值给另一字符串s s a i 2 将字符串a完全赋值给新字符串s s assign a 3 将字符串a的一部分赋值给新的字符串s start是截取字符串的首位
  • 【转】mysql索引(最左匹配原则)

    阐述 通常我们在建立联合索引的时候 相信建立过索引的同学们会发现 无论是Oracle 还是 MySQL 都会让我们选择索引的顺序 比如我们想在 a b c 三个字段上建立一个联合索引 我们可以选择自己想要的优先级 a b c 或是 b a
  • 常用语言的线程模型(Java、go、C++、python3)

    背景知识 软件是如何驱动硬件的 硬件是需要相关的驱动程序才能执行 而驱动程序是安装在操作系统内核中 如果写了一个程序A A程序想操作硬件工作 首先需要进行系统调用 由内核去找对应的驱动程序驱使硬件工作 而驱动程序怎么让硬件工作的呢 驱动程序
  • STM8L在IAR编译时出现Warning[Pe188]: enumerated type mixed with another type

    STM8L在IAR编译时出现Warning Pe188 enumerated type mixed with another type 给枚举变量赋值了其它类型 产生的原因可能和编译器有关 具体原因尚不清楚 但可以在调用处加入强制类型转换下
  • Cow Marathon(树的直径)(暂存)

    Cow Marathon After hearing about the epidemic of obesity in the USA Farmer John wants his cows to get more exercise so h
  • dedecms织梦后台添加变量提示Request var not allow

    一共找到了两种解决方案 第一种解决方案 根目录打开include common inc php找到下面内容 检查和注册外部提交的变量 2011 8 10 修改登录时相关过滤 function CheckRequest val if is a
  • 贵阳个税系统代理服务器地址,贵阳金三个税服务器地址

    贵阳金三个税服务器地址 内容精选 换一换 文章目录一 keepalived 1 keepalived是什么 2 keepalived工作原理二 配置步骤 第一步 配置两台DR第二步 配置第一台节点服务器web1第三步 配置第二台节点服务器w
  • 设计模式 - 外观模式

    1 介绍 1 1定义 定义了一个高层 统一的接口 外部与通过这个统一的接口对子系统中的一群接口进行访问 1 2 主要作用 实现客户类与子系统类的松耦合 降低原有系统的复杂度 提高了客户端使用的便捷性 使得客户端无须关心子系统的工作细节 通过
  • TCP/IP介绍001

    自下而上分为 网络接口层 网络层 传输层 应用层四部分 其各层作用分为 网络接口层 TCP IP最底层 负责接收IP数据包并通过网络发送 或者从网络上接收物理帧 抽出IP数据报 交给IP层 网络层 是TCP IP协议族中非常关键的一层 主要
  • Oracle11.2.0.4升级补丁包

    Oracle11 2 0 4升级补丁包 说明 系统版本 RedHat 7 6 Oracle版本 11 2 0 4 64位 OPatch补丁版本 p6880880 112000 Linux x86 64 zip Oracle补丁版本 p317
  • Android Studio JDK设置详解

    Android Studio JDK设置详解 Android Studio是当前广泛用于Android应用开发的集成开发环境 IDE 在使用Android Studio进行开发时 必须配置Java Development Kit JDK 以
  • unity用虚拟相机截图

    1 工程 2 脚本 Capture cs using System Collections using System Collections Generic using UnityEngine using System IO public
  • Javascript 脚本语言

    JavaScript代码可以直接嵌在网页的任何地方 不过通常我们都把JavaScript代码放到中 JavaScript代码块一般放在script标签中 1 外链式 用script引入外部的js文件 2 内嵌式 在script标签之间直接写
  • kibana解决Kibana server is not ready yet问题

    我使用的是Docker进行安装的Elasticsearch7 8 0和Kibana7 8 0 安装之后 访问Elasticsearch的9200端口 能正常访问 但是访问Kibana的5601端口 则出现的了 Kibana server i
  • ubuntu 下安装vnc-server

    Ubuntu下安装VNC server 尽管我们在大部分情况下用ssh登录Ubuntu服务器就好了 但是有时候我们的程序需要在图形界面下运行 这时我们就要用到vnc server这个软件了 在Ubuntu下安装vnc server很简单的
  • Docker部署Redis

    Docker部署Redis 准备工作 在CentOS或者Linux创建部署目录 用于存放容器的配置和Redis数据 目的是当重装或者升级容器时 配置文件和数据不会丢失 执行以下命令 a 创建目录 mkdir p container redi
  • 17. 线性代数 - 矩阵的逆

    文章目录 矩阵的转置 矩阵的逆 Hi 您好 我是茶桁 我们已经学习过很多关于矩阵的知识点 今天依然还是矩阵的相关知识 我们来学一个相关操作 矩阵的转置 更重要的是我们需要认识 矩阵的逆 矩阵的转置 关于矩阵的转置 咱们导论课里有提到过 转置
  • 单片机程序中遇到的错误和警告小结

    warning C316 unterminated conditionals 头文件中条件编译或预编译错误 注意 ifndef和 endif的对应即可 还有一种警告情况是定义的参数没有用到 很多都忘记了 先贴这么多吧
  • MYSQL--架构--MGR--理论--02--架构

    MYSQL 架构 MGR 理论 02 架构 1 架构图 1 1 主要组成 APIs接口层 组件层 复制协议模块层 GCS API Paxos 引擎层 1 2 事务进入 MGR 层内部处理过程 应用发来的事务从 MySQL Server 经过
  • QT笔记-生成PDF文件(附带完整源码)绘制表格和文字

    项目链接 https download csdn net download C panpan 88268845 https download csdn net download C panpan 88268845 h public void