一、 简介
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的全部内容。
以上。