C++ 为什么删除对象时没有明显的代码?
在qt中,我使用tablewidget存储100行。首先,我创建了一个新的tableWidgetItems来填充行。 当它运行时,我设置项目的属性,而不再设置为“新建”。 但我发现在使用“ui->tableWidget->setRowCount(index);”之后,如果稍后设置回100,代码“ui->tableWidget->item(index,0)->setText(…);”将使程序崩溃。太糟糕了;( 我调试并找到了“设置回100”之前设置为行计数的新索引>索引 当我设置较小的行数时,系统是否自动删除表项?? 我非常担心这一点,因为即使是我的代码也无法确定我创建的对象的生存期……有人知道如何在设置行数后使它们保持“活动”吗?(否则,我必须重新创建它们……)。 我真的很感激你能耐心地读我可怜的ELis:) 新的: 另一个功能:C++ 为什么删除对象时没有明显的代码?,c++,qt,object,C++,Qt,Object,在qt中,我使用tablewidget存储100行。首先,我创建了一个新的tableWidgetItems来填充行。 当它运行时,我设置项目的属性,而不再设置为“新建”。 但我发现在使用“ui->tableWidget->setRowCount(index);”之后,如果稍后设置回100,代码“ui->tableWidget->item(index,0)->setText(…);”将使程序崩溃。太糟糕了;( 我调试并找到了“设置回100”之前设置为行计数的新索引>索引 当我设置较小的行数时,系统
{
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(索引)//将行计数设置为30多或少”,它运行良好,没有崩溃,索引引用行之后的行显示与之前相同的数据。
setRowCount
确保表正好容纳这么多行。如果您的行数超过以前的索引
,则这些行将消失(删除)
如果要临时隐藏行,可能应该使用/
showRow
,而不是重置行数。setRowCount
确保表正好容纳这么多行。如果您的行数超过以前的索引
,则这些行将消失(删除)
如果您想临时隐藏行,您可能应该使用/
showRow
而不是重置行数。您可以显示用于创建表格小部件的代码吗?IIRC,Qt类型管理作为子小部件的每个指针的生存期。我不是Qt人,但我认为这与被删除的对象无关,表根本不记得它以前引用的对象//将行数设置为30多或更少’,运行良好,无故障。:)@Enobayram你能展示你用来创建表格小部件的代码吗?IIRC,Qt类型管理作为子小部件的每个指针的生存期。我不是Qt人,但我认为这与被删除的对象无关,该表根本不记得它以前引用的对象//将行数设置为30多或更少’,运行良好,无故障。:)@伊诺巴亚拉姆
{
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);
}
}