QTableWidget是QT程序中,常用的显示数据表格控件,其用法也不再赘述,这里就说一说多选接口的使用方法,区别和问题。
首先,表格支持多选(Ctrl、Shift、 Ctrl+A都可以),需要对表格进行属性设置:
setSelectionMode(QAbstractItemView::ExtendedSelection);
另外,还可以对选中模式进行设置,比如选中时,默认选中一行数据:
setSelectionBehavior(QAbstractItemView::SelectRows);
建立一张表,按照如下图所示的步骤,多选效果如下:
对于已经多选的单元格,如何进行获取,接口提供了两个:selectedItems和selectedRanges。代码如下:
QList<QTableWidgetItem*> selectItems = this->ui->tableWidget->selectedItems();
qDebug() << "selectedItems("<<selectItems.size()<<")----------";
for(auto item:selectItems)
{
qDebug() << item->row() <<", "<< item->column();
}
QList<QTableWidgetSelectionRange> selectRanges = this->ui->tableWidget->selectedRanges();
qDebug() << "selectedRanges("<<selectRanges.size()<<")----------";
for(auto range:selectRanges)
{
qDebug() << range.rowCount() <<", "<< range.columnCount() << ": "
<<range.topRow()<<","<<range.bottomRow()<<", "<<range.leftColumn() <<","<<range.rightColumn();
}
上图的输出结果:
基于事实,以及接口文档,对比说明如下:
接口 | selectedItems | selectedRanges |
---|---|---|
返回结果 | QList<QTableWidgetItem*> | QList<QTableWidgetSelectionRange> |
返回说明 | 选中单元格的,元素的列表 | 选中区域元素,边界的列表 |
list.size() | 9 | 7 |
区别 |
|
|
所以,结论1:获取选中的单元格,应首选selectedItems接口。
所以,结论2:获取的list的顺序,是选中的顺序,不是index顺序。
所以,结论3:如果只关心选中的所在行,或者所在列,需要自己过滤。特别是在设置了选中模式的条件下。
所以,结论4:对选取的单元格进行操作,特别是删除,记得先排序,再从最大索引,往最小索引方向,进行操作。