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