0

在 qt 中,我使用 tablewidget 来存储 100 行。起初,我新建 tableWidgetItems 来填充行。在它运行时,我设置了项目的属性,不再是“新的”。但是我在使用'ui->tableWidget->setRowCount(index);'后发现 ,后来又设置回100,代码“ui->tableWidget->item(index, 0)->setText(...);” 会使程序崩溃。那太糟糕了!!!;(我调试并发现新的索引>索引设置为行计数之前'设置回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->tableWidget->setRowCount(index);//将行数设置为 30 或多或少',它运行良好而不会崩溃,并且 index-referred-row 之后的行显示相同的数据前。

4

1 回答 1

3

setRowCount确保表恰好包含那么多行。如果您有比index以前更多的行,则这些行将消失(删除)。

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

于 2012-10-07T12:10:41.173 回答