关于QTableWidget中的数量众多的item所占内存比较多,用完要释放的问题。
现在有两个问题:
1 是什么时候释放?
2 如何释放
我们先看第一个问题,因为我现在的程序里面是定期刷新table,每次加载大量的数据,所以如果不清除之前的内存,就会使内存一直申请得不到释放最终导致内存泄露。当次显示完就释放显然不合适,因为item被delete掉后表中的内容就也不见了,因为指向的内存块区域的值给清除了。那么我们很容易想到,应该在下次刷新时清除上次申请的内存。
2 如何释放
之前在QT中文论坛上,搜索以前的记录看到有人问过,QTableWidget的clearContents是否可以清除QTableWidgetItem所申请的内存,有人回答可以。但是否可以,没测过,我对此也表怀疑。今天我实际测了一下,证明确实是可以释放的。下面贴下我的测试过程:
思路:启动一个简单GUI程序,此时开任务管理器看内存占用。然后点击一个按钮后,生成一些item,并添加到table中,此时再看内存占用。再点击另一个按钮,调用clearContentes,看增加的内存是否被释放掉。
代码:
void TestClearContents::on_pushButton_clicked()
{
ui.tableWidget->setRowCount(100);
ui.tableWidget->setColumnCount(500);
for (int i = 0;i < 100;i++)
{
for (int j = 0;j < 500;j++)
{
QTableWidgetItem *item = new QTableWidgetItem("aaa");
ui.tableWidget->setItem(i,j,item);
}
}
}
void TestClearContents::on_pushButton_2_clicked()
{
ui.tableWidget->clearContents();
}
结果:初始运行时 点击第一个按钮后 点击释放按钮后
14208 28248 14208
14208 28248 14212
14212 28248 14212
另外,释放内存时,如果用
int row = ui.tableWidget->rowCount();
int column = ui.tableWidget->columnCount();
for (int i = 0;i < row;i++)
{
for (int j = 0;j < column;j++)
{
QTableWidgetItem *item = ui.tableWidget->item(i,j);
if (item)
{
delete item;
}
}
}
这样的方法也可以把内存释放掉,但这个比较慢,是一段一段的释放内存,显然不适合实
分享到:
相关推荐
QTableWidget item文本显示不全的通过气泡提示出来,如果item内容是完全显示的则气泡不会出现。只有显示不全时气泡才会出现。效果图:https://blog.csdn.net/qq_41622002/article/details/111224339
解决qtablewidget加载大量数据卡顿的问题
QTableWidgetItem *checkBoxItem = new QTableWidgetItem(QTableWidgetItem::Type); ``` 2. **设置复选框**:将创建的`QTableWidgetItem`插入到`QTableWidget`中,指定行和列位置。然后,可以使用`setCheckState()`...
首先,我们需要理解QTableWidgetItem类,它是QTableWidget中的基本元素,代表表格中的一个单元格。QTableWidgetItem提供了一些内置的类型,如Int、String等,但默认并不支持CheckBox。因此,我们需要自定义...
ButtonTableWidgetItem(QTableWidgetItem::Type type) : QTableWidgetItem(type) {} void addButton(const QString &text) { QPushButton *button = new QPushButton(text); buttonsLayout.addWidget(button); ...
QTableWidget是一个基于QTableView和QTableWidgetItem的组件,它提供了完整的表格功能,包括添加、删除、编辑单元格等。在创建QTableWidget时,你需要指定行数和列数,这些行和列会自动初始化为空的单元格。 创建...
为了实现这一功能,我们需要自定义`QTableWidgetItem`类,这是`QTableWidget`中用于表示表格项的类。 1. **创建自定义`QTableWidgetItem`** 首先,我们需要创建一个继承自`QTableWidgetItem`的子类,添加一个复选...
* `newitem = QTableWidgetItem("abcd")`:创建一个新的表格单元格项。 * `newitem.setIcon(QIcon(QPixmap("./icon/m1.png")))`: 设置单元格的图标。 * `newitem.setTextAlignment(Qt.AlignVCenter)`:设置单元格的...
首先,我们需要了解`QTableWidgetItem`,它是`QTableWidget`中的基本单元格元素,通常用来存储和显示数据。然而,`QTableWidgetItem`并不直接支持复选框,因此我们需要借助其他方法来实现这一功能。 一种方法是通过...
针对QTableWidget实现复选框、编辑功能的demo,在原生可编辑功能上进行了自定义功能的封装,参考此案例可进行自行扩展更多自定义需求开发,针对有自定义功能需求的开发者有一定启发作用,其中包含完整案例,本项目...
- 数据可以通过`setItem(int row, int column, QTableWidgetItem *item)`方法插入到表格中。`QTableWidgetItem`是一个表示表格单元格的类,可以包含文本、图标等信息。 - `verticalHeaderItem()`和`...
要实现表头带复选框的QTableWidget,我们需要自定义一个QTableWidgetItem子类,该子类继承自QTableWidgetItem,并且包含一个QCheckBox。然后,在设置表头时,我们将这个自定义的QTableWidgetItem实例作为表头的item...
这减少了内存开销,因为QTableWidgetItem是一个轻量级对象,但数量过多仍可能导致内存压力。 2. **数据更新策略**: 当需要切换页面或加载新数据时,先清空现有的QTableWidget中的所有item内容。这一步通过迭代表格...
4. **单元格数据操作**:`item(row, column)`返回指定位置的`QTableWidgetItem`对象,你可以通过这个对象来读写单元格的数据。同时,`setItem()`方法用于设置单元格的内容。 ### 二、QTableWidgetItem 1. **...
QTableWidgetItem *item = new QTableWidgetItem(text); setItem(row, 0, item); event->acceptProposedAction(); } } ``` 为了实现拖放行,还需要重写`startDrag`方法,创建一个MIME对象并开始拖动操作: ```...
QTableWidgetItem *item = new QTableWidgetItem(items[i]); ui->tableWidget->setItem(row, column, item); // 更新行索引,增加新行 row++; } } file.close(); } ``` 反之,将QTableWidget中的数据导出到...
- 可以通过`QTableWidgetItem::setText()`或`QTableWidgetItem::setData()`设置单元格内容。 3. **XML文件写入**: - 创建一个新的`QDomDocument`对象,定义根节点。 - 根据QTableWidget的行数和列数,逐行逐列...
首先,QTableWidget的创建需要导入必要的模块,例如`QtWidgets`中的`QTableWidget`和` QTableWidgetItem`。`QTableWidgetItem`是用于填充单元格的数据对象。下面是一个基本的QTableWidget创建过程: ```python from...
QTableWidgetItem *item = new QTableWidgetItem("Hello"); table->setItem(0, 0, item); ``` 2. 设置表头:使用`setHorizontalHeaderLabels`和`setVerticalHeaderLabels`来设置行头和列头。 ```cpp QStringList...
QTableWidgetItem *item = new QTableWidgetItem("Cell " + QString::number(row+1) + "," + QString::number(col+1)); table->setItem(row, col, item); } } ``` 在`QTableWidget`中,每一行和每一列都可以通过...