QT tableWidget数据 生成PDF并调用外部APP实现报表及打印功能
既然做数据库类型的软件 报表打印自然是必不可缺的,这里换个思路来实现其功能:
生成PDF文件 直接利用第三方app打开PDF来实现打印功能。
这个方法有点类似以前我们用VB生成excel文件并调用打印功能。当然调用EXCEL比较慢,这个方法就快多了
C++
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文件
}
核心代码基本就这些了,以后再考虑是否增加一些内容。
初步设想是生成一个临时数组 来打印数组里的内容,那样不在调用数据库应该更快一点。
登录后可发表评论
点击登录