Qt输出pdf,画表格
时间: 2025-05-22 21:11:41 浏览: 15
在Qt中输出包含表格的PDF,可以通过QPainter结合QPdfWriter来实现。以下是详细的步骤说明和代码示例:
---
### 实现步骤
1. **创建 PDF 文件**
使用 `QPdfWriter` 创建 PDF 文件,并设置其分辨率和其他属性。
2. **绘制表格**
利用 `QPainter` 绘制表格的边框、单元格文本等内容。可以根据需求动态计算行高、列宽等信息。
3. **分页处理**
如果表格内容较多超出单页范围,需手动分割数据并在新页面继续绘制。
4. **导出 PDF**
将所有内容绘制完成后保存到目标路径下的 PDF 文件中。
---
### 示例代码
以下是一个完整的代码示例:
```cpp
#include <QPdfWriter>
#include <QPainter>
#include <QStringList>
#include <QDebug>
void exportTableToPdf(const QString &filePath) {
// 数据源:模拟表格数据
QStringList headers = {"序号", "名称", "年龄"};
QList<QList<QString>> data;
for (int i = 0; i < 20; ++i) { // 假设有20条记录
data.append({QString::number(i + 1), QStringLiteral("用户%1").arg(i + 1), QString::number(20 + i)});
}
QPdfWriter pdf(filePath);
QPainter painter(&pdf);
const int pageSizeWidth = 595; // A4 页面宽度(像素)
const int pageSizeHeight = 842; // A4 页面高度(像素)
pdf.setPageSize(QPagedPaintDevice::A4); // 设置页面大小为 A4
pdf.setResolution(72); // 分辨率 DPI
const QFont font("Times New Roman", 12); // 字体样式
painter.setFont(font);
const int headerRowHeight = 40; // 表头高度
const int cellHeight = 30; // 单元格高度
const int columnWidths[] = {50, 200, 100}; // 各列宽度
int currentY = 50; // 当前绘图位置 Y 轴起点
bool newPageStarted = false;
// 绘制表头
if (!newPageStarted && currentY > pageSizeHeight - headerRowHeight) {
painter.end();
return; // 检查是否超出页面限制
}
drawTableRow(painter, headers, columnWidths, headerRowHeight, true, currentY);
currentY += headerRowHeight;
// 绘制表格内容
foreach(auto row, data) {
if(currentY >= pageSizeHeight - cellHeight){
painter.save(); // 开始新页面
pdf.newPage();
painter.restore();
currentY = 50;
drawTableRow(painter, headers, columnWidths, headerRowHeight, true, currentY);
currentY += headerRowHeight;
}
drawTableRow(painter, row, columnWidths, cellHeight, false, currentY);
currentY += cellHeight;
}
}
// 辅助函数:绘制一行表格
void drawTableRow(QPainter &painter, const QStringList &row, const int *columnWidths, int height, bool isHeader, int yPosition) {
QRect rectLeft(50, yPosition, columnWidths[0], height);
QRect rectCenter(rectLeft.right(), yPosition, columnWidths[1], height);
QRect rectRight(rectCenter.right(), yPosition, columnWidths[2], height);
QColor textColor(isHeader ? Qt::white : Qt::black);
QColor bgColor(isHeader ? Qt::blue : Qt::lightGray);
painter.fillRect(rectLeft, bgColor);
painter.drawText(rectLeft, Qt::AlignCenter | Qt::TextWordWrap, row.at(0));
painter.fillRect(rectCenter, bgColor);
painter.drawText(rectCenter, Qt::AlignCenter | Qt::TextWordWrap, row.at(1));
painter.fillRect(rectRight, bgColor);
painter.drawText(rectRight, Qt::AlignCenter | Qt::TextWordWrap, row.at(2));
}
```
---
### 关键点解析
1. **字体与对齐方式**
可以通过 `QFontMetrics` 计算文字的高度和宽度,确保不会溢出单元格。
2. **自动换页机制**
当当前行即将超过页面底部时,调用 `qpainter->end()` 结束旧页面并开始新的一页。
3. **自适应列宽**
根据实际需求调整每一列的固定宽度或百分比分配比例。
---
阅读全文
相关推荐
















