问题描述
QTableWidget控件,有item,但是item没有数据,界面表现上可以选中,但是selectedItems函数返回的结果中,没有无数据但被选中的item。itemAt函数也是,给定的坐标点,有item,但是item没有数据,返回结果是空指针。
问题原因分析
代码中并没有主动向QTableWidget中添加数据,数据添加全靠界面上双击编辑自动添加的。QTableWidget的界面上显示有单元格,但有单元格不一定有item。由于我们没有在代码中主动添加数据,也就没有item。而直接在界面双击单元格进行编辑时,QTableWidget会自动调用setItem函数向QTableWidget添加item,没有数据的单元格自然也就没有item,而没有item,selectedItems和itemAt都不会有结果返回。
问题解决方案
主动添加item
在QTableWidget设置好单元格后,不管是否要添加数据,先主动调用setItem函数为点单元格设置item。
使用QModelIndex
该方法也是Qt官方推荐的方法,不依赖于单元格是否有数据。将selectedItems和itemAt替换成selectionModel和indexAt,具体代码如下
cpp
void Dialog::deleteSelect()
{
QItemSelectionModel *selectionModel = ui->tableWidget->selectionModel();
QModelIndexList selectedIndexes = selectionModel->selectedRows(0);
for(auto it = selectedIndexes.rbegin(); it != selectedIndexes.rend(); ++it)
ui->tableWidget->removeRow(it->row());
}
bool Dialog::eventFilter(QObject *object, QEvent *event)
{
if(object == ui->tableWidget->viewport())
{
if(event->type() == QEvent::MouseButtonRelease)
{
QMouseEvent *mouseEvent = dynamic_cast<QMouseEvent*>(event);
if(mouseEvent)
{
QPoint pos = mouseEvent->pos();
QModelIndex index = ui->tableWidget->indexAt(pos);
if(!index.isValid())
{
ui->tableWidget->clearSelection();
}
}
}
}
return QDialog::eventFilter(object, event);
}