Anj*_*anu 5 qt qtablewidget qtablewidgetitem
假设我有一个装满数据的二维数组,比如10 x 10.内容和行数可以随时改变.现在我想在QTableWidget中显示这些数据.
我使用超时1秒的计时器来刷新表格内容.如果我使用,在超时槽中
void slot_timeOut()
{
//Iterate over the rows
//and for each cell do something like
ui->tw_data->setItem(row, 0, new TableWidgetItem(data[row][0]);
ui->tw_data->setItem(row, 0, new TableWidgetItem(data[row][1]);
//...
ui->tw_data->setItem(row, 0, new TableWidgetItem(data[row][9]);
}
Run Code Online (Sandbox Code Playgroud)
使用新的TableWidgetItem让我很担心.我没有提及它,我从来没有删除它.
在一段时间内这是一个内存泄漏,或者由Qt管理,请帮助...
没有泄漏,如
该表取得该项目的所有权.
(来自QTableWidget :: setItem()).
这里的所有权意味着QTableWidget将在不再需要时删除项目,或者销毁QTableWidget本身.所有权通常记录在Qt文档中(如果没有,我会考虑Qt错误).
一旦setItem()从同一个单元格上调用返回,之前设置的QTableWidgetItem将被删除:
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QTableWidget widget(2, 1);
QTableWidgetItem* foo = new QTableWidgetItem("Foo");
widget.setItem(0, 0, foo);
qDebug() << foo->text(); //works
widget.setItem(0, 0, new QTableWidgetItem("Bar")); //replaces foo with bar and deletes foo
qDebug() << foo->text(); // Undefined (usually, crash)
widget.show();
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Linux,则还可以通过在valgrind中使用--leak-check = full运行上面的代码(没有第二个qDebug())来验证行为.