Qt富文本生产表格并保存为PDF到固定位置

一、 简介

Qt生成表格的方式有很多种,包括html、Qtablewidget、Qtableview、以及本文重点要讲的富文本生成表格。在此之前我先总结一下html、html、Qtablewidget、Qtableview的优缺点。
1.1 html

 QString str = "<table border='1' cellpadding='10'>"        
" <tr>   <td>编号</td>   <td>课程名称</td>   <td>成绩</td>    <td>学分</td>   <td>绩点</td> </tr> "           
" <tr>   <td> 1 </td>   <td>"+course[0]+"</td>   <td>"+grade[0]+"</td>    <td>"+xuefen[0]+"</td>   <td>"+jidian[0]+"</td> </tr> "                     
" <tr>   <td> 2 </td>   <td>"+course[1]+"</td>   <td>"+grade[1]+"</td>    <td>"+xuefen[1]+"</td>   <td>"+jidian[1]+"</td> </tr> "                     
" <tr>   <td> 3 </td>   <td>"+course[2]+"</td>   <td>"+grade[2]+"</td>    <td>"+xuefen[2]+"</td>   <td>"+jidian[2]+"</td> </tr> "                     
" <tr>   <td> 4 </td>   <td>"+course[3]+"</td>   <td>"+grade[3]+"</td>    <td>"+xuefen[3]+"</td>   <td>"+jidian[3]+"</td> </tr> "                     
" <tr>   <td> 5 </td>   <td>"+course[4]+"</td>   <td>"+grade[4]+"</td>    <td>"+xuefen[4]+"</td>   <td>"+jidian[4]+"</td> </tr> "                     
" <tr>   <td> 6 </td>   <td>"+course[5]+"</td>   <td>"+grade[5]+"</td>    <td>"+xuefen[5]+"</td>   <td>"+jidian[5]+"</td> </tr> "                     
" <tr>   <td> 7 </td>   <td>"+course[6]+"</td>   <td>"+grade[6]+"</td>    <td>"+xuefen[6]+"</td>   <td>"+jidian[6]+"</td> </tr> "                     
"</table> ";       
ui->textEdit->insertHtml(str);

在这里插入图片描述
在我的尝试中,这种生成图表的方式非常麻烦,而且不能定位某个表格坐标,也就是说,所有的数据插入都必须提前定义一个变量,例如,如果我想在第五行第五列添加数据,必须在第五行第五列定义一个变量,假设该变量为a,想要在5行5列插入数据,必须先将数值给a,对于数据量的的赋值,例如通过串口导入数据到表格的某一位置就会变得相当麻烦。
1.2Qtableview

  if(data2.mid(0,8)=="01400003")
            {
                ui->qTableWidget_3->setItem(i,4,new QTableWidgetItem(data2.mid(12,4)));
            }else if(data2.mid(4,2)=="01")
            {
                ui->qTableWidget_3->setItem(i,4,new QTableWidgetItem("功能码错误"));
            }
            else if(data2.mid(4,2)=="03"){
                ui->qTableWidget_3->setItem(i,4,new QTableWidgetItem("寄存器或数据数量错误"));
            }
            else if(data2.mid(4,2)=="30"){
                ui->qTableWidget_3->setItem(i,4,new QTableWidgetItem("寄存器地址错误"));
            }
            else if(data2.mid(4,2)=="31"){
                ui->qTableWidget_3->setItem(i,4,new QTableWidgetItem("访问受限"));
            }
            else if(data2.mid(4,2)=="32"){
                ui->qTableWidget_3->setItem(i,4,new QTableWidgetItem("设定值超出范围"));
            }
            else if(data2.mid(4,2)=="33"){
                ui->qTableWidget_3->setItem(i,4,new QTableWidgetItem("数据一致性错误"));
            }
            else if(data2.mid(4,2)=="34"){
                ui->qTableWidget_3->setItem(i,4,new QTableWidgetItem("条件错误"));
            }
            else if(data2.mid(4,2)=="35"){
                ui->qTableWidget_3->setItem(i,4,new QTableWidgetItem("当前资源不可处理"));
            }

如上,串口可直接输入数据到表格的某一位置,利用函数setItem(),而在我的经验中,当数据量变大时,Qtablewidget保存为excel会奔溃。
3.利用富文本生成表格
利用富文本生成表格是本文的重点,但网上的资料并不多,而我使用的范围也并不大,仅仅是生成一个表格,导入串口输入的数据,如何保存成PDF,保存成PDF也有亮点,即将PDF一键保存到固定的路径,如果有该路径则自动保存,如果没有则自动创建后保存至该固定路径。下面是部分代码讲解,如果有需要,可QQ:1505519602。


    QTextCursor cursor1(ui->textEdit->textCursor());//将表格创建在textedit上,一般利用富文本都需要创建在textedit上
    QTextTableFormat tableFormat2;  //该类是表格的格式类,创建一个表格的格式类,方便修改表格的格式
    tableFormat2.setCellPadding(0); //更改其值可改变表格大小,非常非常非常重要
    tableFormat2.setCellSpacing(0); //更改单元格线与线之间的距离,可使单元格为单线
    tableFormat2.border();
    tableFormat2.setBorder(0);      //使表格线宽为0
    QTextTable *table1 = cursor1.insertTable(4, 6,tableFormat2);//创建一个4X6的表,名字是table,格式是tableFormat2
    QTextTableCell cell1 = table1->cellAt(2,0);
    QTextCharFormat format1 = cell1.format();//创建单元格的格式
    format1.setBackground(Qt::white);//单元格的背景是白色
    table1->cellAt(0,0).firstCursorPosition().insertHtml("订单号(Order No.):");//单元格(0,0)内插入数据是订单号
    table1->cellAt(0,1).firstCursorPosition().insertImage(":/images/kong.png");//插入图片
    table1->cellAt(0,3).firstCursorPosition().insertHtml("工单号(Work order No.):");
    table1->cellAt(0,4).firstCursorPosition().insertImage(":/images/kong.png");
    table1->cellAt(0,5).firstCursorPosition().insertHtml("客户名称(Customer):");
    table1->cellAt(2,0).firstCursorPosition().insertHtml("物料号(Material No.):");
    table1->cellAt(2,3).firstCursorPosition().insertHtml("人员编号(Personnel No.):");
    table1->cellAt(2,5).firstCursorPosition().insertHtml("日   期(Date):");

以上就是创建一个单元格并且添加数据,接下来是将串口的数据导入单元格的各个位置

            serial->write(senddata);//串口读入数据
            serial->waitForReadyRead(1);
            QByteArray temp = serial->readAll();
            // QDataStream out(&temp1,QIODevice::ReadWrite);    //将字节数组读入
            QString data1=temp.toHex();
            QString data2=data1.mid(10,4);//字符串
            int t =data2.toInt(0,16) ;//转化成int(不带小数点)
            double ts=(double)t/100;
            double F =((double)t/100.0)*1.8+32.0;//以上是将数据格式变换一下
            QString str = QString::number(ts,'f',2);
            QString strF = QString::number(F,'f',2);
            // QString str2=str.mid(0,2)+"."+str.mid(2,2);
            QDateTime current_date_time =QDateTime::currentDateTime();
            QString current_date =current_date_time.toString("hh:mm:ss");
            table->cellAt(1,4).firstCursorPosition().insertHtml(current_date);//将变换好的数据插入表格
            table->cellAt(1,7).firstCursorPosition().insertHtml(current_date);
            table->cellAt(1,5).firstCursorPosition().insertHtml(str+"℃");
            table->cellAt(1,6).firstCursorPosition().insertHtml(strF+"℉");

在这里插入图片描述

最后是一键保存到固定路径

            QDir *photo = new QDir;//创建一个新的路径
            bool exist = photo->exists("D://PDFDATA");//将路径赋给exist
            if(exist)//做一个判断,判断路径是否存在,如果存在
            {
                QString fname=QDateTime::currentDateTime().toString("yyyy.MM.dd hh.mm.ss");//文件名
                QPrinter printer(QPrinter::ScreenResolution);//利用qt的QPrinter创建PDF纸张
                printer.setPaperSize(QPrinter::A4);
                printer.setOutputFormat(QPrinter::PdfFormat);
                // printer.setOutputFileName(QString(fname)+".pdf");
                printer.setOutputFileName("D://PDFDATA//"+QString(fname)+"  表格.pdf");   //设置输出路径及名称
                ui->textEdit->document()->print(&printer);//将textEdit中的内容打印成PDF
               
                if( ui->actiontable->iconText()=="表格")
                {
                    QMessageBox::about(this, tr("提示"), tr("保存成功"));
                }else if(ui->actiontable->iconText()=="Table")
                {
                    QMessageBox::about(this, tr("Tips"), tr("Save sucessed!"));
                }


            } else//如果路径不存在,则自动新建一个文件夹

            {
                //创建photo文件夹
                photo->mkdir("D://PDFDATA");//新建一个文件夹,其余相同
                QString fname=QDateTime::currentDateTime().toString("yyyy.MM.dd hh.mm.ss");
                QPrinter printer(QPrinter::ScreenResolution);
                printer.setPaperSize(QPrinter::A4);
                printer.setOutputFormat(QPrinter::PdfFormat);
                // printer.setOutputFileName(QString(fname)+".pdf");
                printer.setOutputFileName("D://PDFDATA//"+QString(fname)+"  表格.pdf");   //设置输出路径
                ui->textEdit->document()->print(&printer);
                ui->curveShowWidget->savePdf("D://PDFDATA//"+QString(fname)+"  曲线.pdf");
                if( ui->actiontable->iconText()=="表格")
                {
                    QMessageBox::about(this, tr("提示"), tr("保存成功"));
                }else if(ui->actiontable->iconText()=="Table")
                {
                    QMessageBox::about(this, tr("Tips"), tr("Save sucessed!"));
                }
            }

这就是利用Qt富文本创建表格并导出为PDF的全部内容。

以上。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值