二、QTableWidget 类 clear() 和 clearContents() 的区别及程序崩溃原因分析

本文分析了QTableWidget的clear()和clearContents()方法的区别,指出不当使用可能导致空指针异常,从而造成程序崩溃。提供了两种修复方法:一是只清除内容不删除单元格,二是检查并处理可能的空指针。
摘要由CSDN通过智能技术生成

问题描述:区分 QTableWidget 类的 clear() 和 clearContents() 的用法,以及可能由于这两个方法使用不当导致程序崩溃的原因分析

Qt 官方文档对 QTableWidget 类的 clear() 方法描述如下:

[slot] void QTableWidget::clear()
Removes all items in the view. This will also remove all selections and headers. If you don't want to remove the headers, use QTableWidget::clearContents(). The table dimensions stay the same.

翻译过来就是,clear() 函数会删除表格中的所有单元格,也会删除选中的部分和表头,但不会改变原先设置的行数和列数

Qt 官方文档对 QTableWidget 类的 clearContents() 方法描述如下:

[slot] void QTableWidget::clearContents()
Removes all items not in the headers from the view. This will also remove all selections. The table dimensions stay the same.

翻译过来就是,clearContents() 函数会删除表格中的所有单元格,也会删除选中的部分,但不会删除表头,也不会改变原先设置的行数和列数

clear() 和 clearContents() 的相同点在于都会删除表格中的所有单元格,也会删除选中的部分,并且保持原先设置的行数和列数不变,区别在于 clear() 会删除表头,clearContents() 不会删除表头

在程序中如果对 clear() 和 clearContents() 方法调用不当,将会导致程序崩溃,究其原因在于这两个方法删除了表格中的所有单元格,导致了空指针,如果对空指针进行操作,将会使得程序崩溃

void clearTable()
{
    table->clear();      // 或者 table->clearContents()
}

void setTableText(QVector<QStringList> textSL)
{
    for(int i=0; i<textSL.size(); i++)
    {
        QStringList sl = textSL.at(i);
        for(int j=0; j<sl.size(); j++)
        {
            table->item(i,j)->setText(sl.at(j));
        } 
    }    
}

先下结论,上述代码会导致程序崩溃!!!

上述代码逻辑我们在程序中经常使用,clearTable() 函数清空表格内容,setTableText() 为表格所有单元格再赋新值。程序崩溃的原因在于 clear() 和 clearContents() 删除了表格中的所有单元格,导致了 table->item(i,j) 空指针,再调用 setText() 函数导致程序崩溃

为了解决上述空指针问题,需对代码进行修改,即清空内容的时候不要删除单元格,或者在调用单元格函数的时候先判断指针是否为空,如果为空,则为该单元格创建一个 QTableWidgetItem

方法1:清空内容的时候不要删除单元格

void clearTable()
{
    for(int i=0; i<table->rowCount(); i++)
    {
        for(int j=0; j<table->columnCount(); j++)
        {
            table->item(i,j)->setText("");
        }
    }
}

void setTableText(QVector<QStringList> textSL)
{
    for(int i=0; i<textSL.size(); i++)
    {
        QStringList sl = textSL.at(i);
        for(int j=0; j<sl.size(); j++)
        {
            table->item(i,j)->setText(sl.at(j));
        } 
    }    
}

方法2:在调用单元格函数的时候先判断指针是否为空,如果为空,则为该单元格创建一个 QTableWidgetItem 

void clearTable()
{
    table->clearContents();
}

void setTableText(QVector<QStringList> textSL)
{
    for(int i=0; i<textSL.size(); i++)
    {
        QStringList sl = textSL.at(i);
        for(int j=0; j<sl.size(); j++)
        {
            if(!table->item(i,j))
            {
                QTableWidgetItem * item = new QTableWidgetItem;
                table->setItem(i,j,item);
            }
            table->item(i,j)->setText(sl.at(j));
        } 
    }    
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yann@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值