无意中发现了Qt中QTableWidget可以实现单元格的合并,函数为setSpan,函数原型如下:
void QTableView::setSpan(int row, int column, int rowSpanCount, int columnSpanCount)
参数为:行数、列数、需要合并的行总数、需要合并的列总数。
写了一个测试函数,代码如下:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->tableWidget->setRowCount(10);
ui->tableWidget->setColumnCount(10);
for (int i(0); i<10; ++i)
{
for (int j(0); j<10; ++j)
{
QTableWidgetItem *pItem = new QTableWidgetItem;
pItem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter)
ui->tableWidget->setItem(i, j, pItem);
}
}
int column[]{0, 3, 6, 8};
int rowCount = ui->tableWidget->rowCount();
int col = sizeof(column)/sizeof(column[0]);
for (int i(0); i<rowCount; i += 3)
{
for (int j(0); j<col; ++j)
{
ui->tableWidget->setSpan(i, column[j], 3, 1);
}
}
ui->tableWidget->item(0, 0)->setText("(1,1)");
ui->tableWidget->item(1, 0)->setText("(2,1)");
ui->tableWidget->item(2, 0)->setText("(3,1)");
ui->tableWidget->item(3, 0)->setText("(4,1)");
}
显示结果如下:
作为测试,我特意在代码中加入了几行用于显示坐标的代码,由结果可见,合并之后的单元格,只有初始的那一个才能正常显示,其他的都已经不能显示了。
被合并的单元格的索引都指向第一个单元格。
鉴于此,我又加了几条测试信息:
qDebug() << ui->tableWidget->item(0, 0);
qDebug() << ui->tableWidget->item(1, 0);
qDebug() << ui->tableWidget->item(2, 0);
qDebug() << ui->tableWidget->item(3, 0);
打印输出如下:
然后我又加了几条测试语句:
qDebug() << ui->tableWidget->item(0, 0)->text();
qDebug() << ui->tableWidget->item(1, 0)->text();
qDebug() << ui->tableWidget->item(2, 0)->text();
qDebug() << ui->tableWidget->item(3, 0)->text();
打印结果如下:
由此可见,这几个item还是存在的,并且文字也是有的,而且是当时设置的那个,只不过是不显示了。
然后,我将其中(0,0)坐标的单元格恢复合并之前的状态,代码如下:
ui->tableWidget->setSpan(0, 0, 1, 1);
显示结果如下:
由上面的演示结果可以看出,这个setSpan函数,仅仅是将某个(些)单元格的显示范围变大,对于合并范围之内的其他单元格仅仅是隐藏掉罢了,并没有删除任何原先存在的单元格。