一、部件说明
qtablewidget部件常用来作为qt界面表格显示工具,qtablewidget是qtableview的子类,其区别是qtableview可以使用自定义的数据模型来显示内容,而qtablewidget只能使用标准的数据模型,并且其数据单元格是QTableWidgetItem的对象来实现的,即不需要数据源绑定。
二、部件使用
1、设置表单样式
//设置列数
m_p->setColumnCount(6);
//设置水平表头
m_p->setHorizontalHeaderLabels(QStringList()<<"序号"\
<<"器件名称"<<"规格型号"<<"数量(个)"\
<<"备注(制造商)"<<"编码");
//设置表头颜色
m_p->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue;}");//天蓝色填充表头
m_p->setSelectionBehavior(QAbstractItemView::SelectRows);//设置表格选择方式:设置表格为整行选中
m_p->setSelectionMode(QAbstractItemView::SingleSelection);//选择目标方式
m_p->setStyleSheet("selection-background-color:blue");//设置选中行颜色:蓝色
//m_p->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);//设置水平滚动条
m_p->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);//设置垂直滚动条
//设置列占满表格,列可以调宽,间隔可拉伸
m_p->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
m_p->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Interactive);
m_p->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Interactive);
//m_p->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Interactive);
m_p->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Interactive);
m_p->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Interactive);
//ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置编辑方式:禁止编辑表格
2、表格操作
加载数据
//加载默认数据到表格
void tableWidgetSet::tableSet()
{
//设置默认行数
tabui->ui->tableWidget->setRowCount(4);
QStringList nameList;
nameList<<"23-xxx"<<"24-xxx"<<"20-xxx"<<"21-xxx";
QList<QString>deviceList;
deviceList<<"均"<<"保"<<"保"<<"he";
QList<QString>list3,list4,list5,list6;
list3<<"R"<<"b"<<"R"<<"T";
list4<<"60"<<"3"<<"0"<<"0";
list5<<"Ω"<<"μ"<<"Ω"<<"A";
list6<<"3"<<"3"<<"3"<<"6";
for(int i=0;i<deviceList.size();i++)
{
int col = 0;
tabui->ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));//第一行第一列
tabui->ui->tableWidget->setItem(i,col++,new QTableWidgetItem(deviceList.at(i)));//第一行第二列
tabui->ui->tableWidget->setItem(i,col++,new QTableWidgetItem(list3.at(i)));
tabui->ui->tableWidget->setItem(i,col++,new QTableWidgetItem(list4.at(i)));
tabui->ui->tableWidget->setItem(i,col++,new QTableWidgetItem(list5.at(i)));
tabui->ui->tableWidget->setItem(i,col++,new QTableWidgetItem(list6.at(i)));
}
}
插入行
//添加行数据
void tableWidgetSet::add_line(QTableWidget *tab)
{
//int curRow = addtab->currentRow();//获取当前行号,在之上插入
int curRow = tab->rowCount();//在尾行插入
tab->insertRow(curRow);
}
删除行
//删除行数据
void tableWidgetSet::delete_line(QTableWidget *tab)
{
int curRow = tab->currentRow();//获取当前行号
tab->removeRow(curRow);//删除当前行及数据
}
获取当前行号
//获取当前行号
void tableWidgetSet::table_row()
{
QList<QTableWidgetSelectionRange> ranges = s_tab->selectedRanges();
if(ranges.count() == 0)
{
qDebug() << QStringLiteral("请选择一行");
}
else
{
for(int i = 0; i < ranges.count(); i++)
{
int topRow=ranges.at(i).topRow();
int bottomRow=ranges.at(i).bottomRow();
for(int j = topRow; j <= bottomRow; j++)
{
qDebug()<<"当前选择行号为:"<<j;
row = j;
}
}
}
}
导入excel数据
//导入数据
void tableWidgetSet::excel_read(QTableWidget *tab,QWidget *p)
{
//弹出文件选择框
QString strData;
QString curPash =QDir::currentPath(); //获取当前路径
QString dlgTitle="选择表格文件";
//xls和xlsx格式的文件都可以,xlsx兼容xls,注意每一种类型后面要加两个分号
QString filter="表格文件(*.xls *.xlsx);;xls文件(*.xls);;xlsx文件(*.xlsx);;所有文件(*.*)";
//创建文件选择对话框
QStringList fileList = QFileDialog::getOpenFileNames(p,dlgTitle,curPash,filter);
if(fileList.count()<1)
return;
for(int i = 0;i<fileList.count();i++)
{
//保存文件地址
strData = fileList.at(i);
}
qDebug()<<strData;
//读取excel数据
QXlsx::Document Rxlsx(strData);
int rowlen = Rxlsx.dimension().rowCount();//获取行数
int columnlen = Rxlsx.dimension().columnCount();//获取列数
tab->setRowCount(rowlen-1);//设置行数
for(int i=0;i<rowlen;i++) //遍历数据
{
for(int j=0;j<columnlen;j++)
{
QString str = Rxlsx.read(i+2,j+1).toString();
tab->setItem(i,j,new QTableWidgetItem(str));
}
}
}
导出数据到excel
//导出设置
void tableWidgetSet::excel_write(QString &path,QTableWidget *tab)
{
QString excelPath;
excelPath = path+"/"+QString("%1.xlsx").arg("器件选型表");
QList<QString>headline;
QTableWidgetItem *cellItem;
QXlsx::Document xlsx;
QXlsx::Format format1;
format1.setFontBold(true);
format1.setFillPattern(QXlsx::Format::PatternSolid);//填充样式
format1.setPatternBackgroundColor(Qt::lightGray);//单元格背景
headline<<"序号"<<"器件名称"<<"规格型号"\
<<"数量(个)"<<"备注(制造商)"<<"编码";
//写表头
for(int a=0;a<tab->columnCount();a++)
{
xlsx.write(1,a+1,headline.at(a),format1);
}
for(int i=0;i<tab->rowCount();i++)
{
for(int j=0;j<tab->columnCount();j++)
{
//获取单元格item
cellItem = tab->item(i,j);
//如果单元格为空,自动填入NULL占位,否则程序会崩溃
if(cellItem==NULL)
{
cellItem = new QTableWidgetItem("NULL");
}
xlsx.write(i+2,j+1,cellItem->text());
}
}
xlsx.saveAs(excelPath);
qDebug()<<path;
}
双击事件
//关联双击table事件
connect(ui->tableWidget,SIGNAL(cellDoubleClicked(int,int)),this,SLOT(showDialog(int,int)));
三、过程中问题记录
1、获取单元格内容时使用Text()函数导致程序崩溃
经测试text()函数获取内容单元格为空值时,程序会崩溃,类似的在写入表格时为空值也会崩溃
解决方法://先获取单元格item tab->item(i,j);再做判断,为空则填入字符占位。