在QTableWidget中,如何釋放使用setCellWidget新增的控制元件元素
阿新 • • 發佈:2020-12-29
技術標籤:QT
本部落格對應的QT版本:Qt 5.12.2
1 使用setCellWidget新增的控制元件元素,如何釋放
在本人的工程中,QTableWidget的表格分為多行多列,且行數是動態變化的。
表格中的每一格都是new一個控制元件(QCombox或者QSpinBox)。
採用以下方式加入到表格的第i行第j列中(i,j從0開始):
QSpinBox* sb = new QSpinBox();
theTableWidget->setCellWidget(i, j, sb);
當表格呼叫 removeCellWidget(0,0)、 removeRow(0)、 clear方法之後,原本new出來的控制元件物件(比如sb )是否被正常釋放呢;
測試如下:
void mainWindow::on_pushButton_clicked()
{
static int lable = 0;
static void* addr = 0; //儲存new出來的sb記憶體地址
if(lable == 0 )//只new一次
{
lable = 1;
QSpinBox* sb = new QSpinBox();
addr = (void*)sb;
sb->setRange(0,1000);
sb->setValue(100);
theTableWidget- >setCellWidget(0, 0, sb);
theTableWidget->removeCellWidget(0,0); //這一句不能釋放sb
//theTableWidget->removeRow(0);//這一句也不能釋放sb
//delete sb;
}
else //訪問new出的地址
{
//訪問之前new出的地址
QSpinBox* sb_2 = (QSpinBox*)addr;
//之前的地址還能訪問,說明沒有被釋放。 若程式奔潰,則之前new出的物件被釋放
int v = sb_2->value();
int bbb = v;
}
}
很遺憾,多次點選按鈕後程序並不奔潰,且sb_2->value()均為100。可以得出結論:實測表明,removeCellWidget(0,0)、 removeRow(0)、 clear方法之後,原本new出來的控制元件物件(比如sb )並不能被自動釋放。需要人為釋放,否則會造成記憶體洩漏。
想通過QT的物件樹記憶體管理技術來實現自動釋放,但是在現有框架下,難以對sb ->setParent(傳參)函式進行傳參。本人的初始想法是將表格的某一行作為sb的父類,那麼在刪除這一行時,sb作為子控制元件會被自動釋放。 但是對於QTableWidget,如何獲取它的某一行的指標(元素)??? 若有知道如何獲取的讀者請留言交流,謝謝!!
QTableWidget的item(i,j)、itemAt方法都測試過了,不起作用!
所以,在表格的每一小格new出新元素後,需要以某種形式儲存起來,在刪除、清除該小格時,要手動delete釋放!!!以免造成記憶體洩漏。