为什么没有明显的代码删除对象?

时间:2012-10-07 09:30:09

标签: c++ qt object

在qt中,我使用tablewidget存储100行。首先,我新建tableWidgetItems来填充行。 在运行时,我设置了项目的属性而不再是'新'。 但我发现在使用'ui-> tableWidget-> setRowCount(index);',然后又设置回100,代码“ui-> tableWidget-> item(index,0) - > setText(...);“将使程序崩溃。那太糟糕了! ( 我调试并找到新索引> index设置为'设置回100'之前的行数。

当我设置较小的行数

时,系统是否自动删除了表项

我非常担心这一点,因为即使我的代码也无法确定我创建的对象的生命周期......有没有人知道如何在设置行数后让它们“活着”?(否则,我必须新建它们.. )。 我非常感谢你耐心地阅读我可怜的ELis:)

新:

//TABLE
    ui->tableWidget->setColumnCount(3);
    ui->tableWidget->setRowCount(100);
    ui->tableWidget->setHorizontalHeaderLabels(headers);

    for(int i = 0; i < 100; i++)//new
    {
        ui->tableWidget->setItem( i, 0 , new QTableWidgetItem(""));//time
        ui->tableWidget->setItem( i, 1 , new QTableWidgetItem(""));//name
        ui->tableWidget->setItem( i, 2 , new QTableWidgetItem(""));//BITS
    }

仅限相关代码行:

   {
    int  index = 0;
    for(int queue_i = size_1; queue_i >= 0; queue_i--)
    {


        if(logDisplayQueue.at(queue_i).at(3) == "0" ||   logDisplayQueue.at(queue_i).at(3) == "2")continue;


        QStringList BITList = bits2Hexs(queue_i);


     ui->tableWidget->item(index, 0)->setText(logDisplayQueue.at(queue_i).at(0));//time
     ui->tableWidget->item(index, 1)->setText(logDisplayQueue.at(queue_i).at(1));//name
     ui->tableWidget->item(index, 2)->setText(BITList.join(""));//BITS

        if(queue_i == oldRowItemNo)ui->tableWidget->selectRow(index);
        index++;
    }

        ui->tableWidget->setRowCount(index);//set row count to be 30 more or less
    }

另一个功能:

    {

        ui->tableWidget->setRowCount(100);//back to be 100 again


        for(int queue_i = size_1, index = 0; queue_i >= 0; queue_i--, index++)
        {

            QStringList BITList = bits2Hexs(queue_i);
     ui->tableWidget->item(index, 0)->setText(logDisplayQueue.at(queue_i).at(0));//time
     ui->tableWidget->item(index, 1)->setText(logDisplayQueue.at(queue_i).at(1));//name
     ui->tableWidget->item(index, 2)->setText(BITList.join(""));//BITS
//In debugging, when index reches the value of old row-count, "->setText" crashes the    //program.


            if(queue_i == oldRowItemNo)ui->tableWidget->selectRow(index);
        }

    }

运行时,它会返回消息,如'指令0x00421727指的是0x00000000内存,内存不能'读''

如果我评论此行: 'ui-&gt; tableWidget-&gt; setRowCount(index); //将行数设置为30或更少',它运行良好而不会崩溃,并且在index-referenced-row之后的行显示与之前相同的数据。

1 个答案:

答案 0 :(得分:3)

setRowCount确保表格恰好包含许多行。如果之前有比index更多的行,那么这些行就会消失(删除)。

如果您想暂时隐藏行,则应该使用hideRow(int) / showRow而不是重置行数。