一、整体思路
表格的操作使用QTableView::setSpan可以实现表格的行和列的合并
表格拆分没有对应的处理函数
主要思路:对表格的属性、内容、拆分与合并的参数进行存储,在进行拆分时对表格内容进行重新创建(不考虑效率问题)
二、效果
1、合并效果
合并操作,是将要合并的项进行了覆盖,被合并的项只是被隐藏了
2、拆分效果
三、部分测试代码
//合并操作
void MainWindow::onSpanCell()
{QModelIndexList list = m_table->selectionModel()->selectedIndexes();if (list.size() < 2){QMessageBox::warning(this, "单元格合并", "所选中单元格中为单个单元格,无法合并", "确定");return;}int minRow = 0;int maxRow = 0;int minCol = 0;int maxCol = 0;QList<QTableWidgetSelectionRange> vec = m_table->selectedRanges();if (vec.size() > 0){minRow = vec[0].topRow();maxRow = vec[0].topRow();minCol = vec[0].leftColumn();maxCol = vec[0].rightColumn();}for (auto v : vec){if (minRow > v.topRow()){minRow = v.topRow();}if (maxRow < v.bottomRow()){maxRow = v.bottomRow();}if (minCol > v.leftColumn()){minCol = v.leftColumn();}if (maxCol < v.rightColumn()){maxCol = v.rightColumn();}}int rowSpan = (maxRow - minRow) + 1;int colSpan = (maxCol - minCol) + 1;m_table->setSpan(minRow, minCol, rowSpan, colSpan);for(auto& pRowInfro:m_tableInfor){if(pRowInfro.first==minRow){for(auto& pColInfro:pRowInfro.second){if(pColInfro.first==minCol){pColInfro.second->rowSpan = rowSpan;pColInfro.second->colSpan = colSpan;}}}}
}
//拆分
void MainWindow::onSplitCell()
{QList<QTableWidgetSelectionRange> vec = m_table->selectedRanges();if (vec.size() < 2){QMessageBox::warning(this, QString::fromLocal8Bit("拆分表格失败"), "单元格已是最小颗粒度,不能再进行拆分", "确定");return;}int row,col;for (auto i : vec){row = i.topRow();col = i.leftColumn();for(auto& pRowInfro:m_tableInfor){if( pRowInfro.first == row ){for(auto& pColInfro:pRowInfro.second){if(pColInfro.first == col){pColInfro.second->rowSpan = 0;pColInfro.second->colSpan = 0;}}}}}createTable();
}