1. 程式人生 > 其它 >在QTableWidget中,如何釋放使用setCellWidget新增的控制元件元素

在QTableWidget中,如何釋放使用setCellWidget新增的控制元件元素

技術標籤: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釋放!!!以免造成記憶體洩漏。