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);
}
相关推荐
名字还没想好☜7 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
一壶浊酒..10 小时前
Scrape Webpack练习
开发语言·javascript·webpack
命运之光11 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
命运之光11 小时前
【C语言完整代码】图书管理系统:图书馆场景下的增删改查实战
c语言·开发语言
猿长大人11 小时前
C# | Serilog 新手入门
开发语言·c#·.net·log
在世修行13 小时前
从零打造 C# 工业视觉检测系统(七):串口通信 SerialPort 封装与开发
开发语言·c#·modbus rtu·rs232/rs485
Hammer_Hans13 小时前
DFT笔记98
java·开发语言·数据库
≮傷£≯√14 小时前
Opencv VideoCapture
qt·opencv
qq_4480111614 小时前
C语言中的野指针和空指针
c语言·开发语言·单片机
估值探索者15 小时前
【Python实时盯盘与预警 #08】成交额突然放大2倍?Python窗口比较抓异动
java·开发语言·python