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);
}
相关推荐
謓泽10 小时前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下10 小时前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
飞天狗11110 小时前
零基础JavaWeb入门——第五课第二小节:九大内置对象 · 第2个:response(响应对象)
java·开发语言
DJ斯特拉10 小时前
axios快速使用
开发语言·前端·javascript
xingpanvip10 小时前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
于先生吖10 小时前
教育类Java实战项目:在线错题整理平台分层架构设计与接口源码解析
java·开发语言
桥田智能10 小时前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
开发小能手-roy11 小时前
StringBuilder vs StringBuffer:2024年还需要线程安全字符串吗?
开发语言·python·安全
开发小能手-roy11 小时前
Java集合框架选型指南:从ArrayList到ConcurrentSkipListMap
java·开发语言
凡人叶枫11 小时前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++