qtablewidget部件常用来作为qt界面表格显示工具,qtablewidget是qtableview的子类,其区别是qtableview可以使用自定义的数据模型来显示内容,而qtablewidget只能使用标准的数据模型,并且其数据单元格是QTableWidgetItem的对象来实现的,即不需要数据源绑定。
//设置列数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);//设置编辑方式:禁止编辑表格
//加载默认数据到表格
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();unt() == 0){qDebug() << QStringLiteral("请选择一行");}else{for(int i = 0; i < unt(); i++){int topRow=ranges.at(i).topRow();int bottomRow=ranges.at(i).bottomRow();for(int j = topRow; j <= bottomRow; j++){qDebug()<<"当前选择行号为:"<<j;row = j;}}}}
//导入数据
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);unt()<1)return;for(int i = 0;i&unt();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 = ad(i+2,j+1).toString();tab->setItem(i,j,new QTableWidgetItem(str));}}
}
//导出设置
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++){//获取单元格itemcellItem = 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);再做判断,为空则填入字符占位。
本文发布于:2024-01-31 22:38:52,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170671193031893.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |