Qt中关于QTableWidget成员函数selectedItems和itemAt(QPoint)无法获取无数据Item的处理方式

问题描述

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);
}
相关推荐
码行山野赴时序归途2 小时前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表
景熙55233 小时前
单体项目编写思路和落地形式
java·开发语言
计算机毕设定制辅导-无忧学长3 小时前
《基于SpringBoot的未成年人健康知识科普平台的设计与实现》
java·开发语言·vue.js·spring boot·未成年人健康知识科普平台
Ivanqhz4 小时前
Ping-Pong 双缓冲
开发语言·人工智能·python·深度学习·mlir
m0_734571764 小时前
深入理解C++ RAII
开发语言·c++
泡海椒4 小时前
jquick-pdf 表格实战:动态数据 PDF 报表生成
java·开发语言·pdf
aramae4 小时前
模拟实现memset()(C语言)
c语言·开发语言·后端
wuyk5554 小时前
【Socket 进阶之路】第 7 章 IO 多路复用 select & poll 完整实战|多 fd 监听、超时等待、优缺点横向对比
服务器·开发语言·网络·数据库·物联网
船厂电气自动化ai大模型5 小时前
AI大模型与数学|第81天 课程:正交向量、正交基、格拉姆‑施密特(Gram‑Schmidt)正交化
开发语言·数据结构·人工智能·线性代数·机器学习
lv__pf5 小时前
seata【实战 msb】
java·开发语言·后端