一、整体思路
表格的操作使用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();
}