背景
QTableWidget需要不断刷新,但是QTableWidget里面不仅申请了QTableWidgetItem,还添加了自定义widget,不确定刷新的时候是否会delete上次申请的内存。
测试结果
目的
TableWidget内存测试,验证tableWidget在 removeRow ,clearContents 和 clean 的时候是否会释放 QTableWidgetItem 和 手动申请的小部件内存.
结果
tableWidget
在 removeRow ,clearContents 和 clean 的时候会释放 QTableWidgetItem 和 手动申请的小部件内存.
测试代码
继承 QTableWidgetItem 的测试代码
class TEST:public QTableWidgetItem
{
public:
TEST(QString str){
this->setText(str);
qDebug()<<"构造TEST:"<< str <<endl;
}
TEST(){qDebug()<<"构造TEST"<<endl;}
~TEST(){qDebug()<<"析构TEST"<<this->text()<<endl;}
};
继承 QLabel 的测试代码
class EmojiWidget : public QLabel
{
public:
EmojiWidget();
EmojiWidget(const QString&fileName);
~EmojiWidget(){
if(m_movie)
{
delete m_movie;
m_movie = NULL;
qDebug()<<"delete movie";
}
qDebug()<<"delete EmojiWidget";
};
public:
void setFileName(const QString&fileName);
QString& getFileName();
protected:
void enterEvent(QEvent *e); //鼠标进入事件
void leaveEvent(QEvent *e); //鼠标离开事件
bool eventFilter(QObject *watched, QEvent *event);
private:
QMovie* m_movie;
QString m_fileName;
};
主程序测试
ui->tableWidget->insertRow(0);
ui->tableWidget->insertRow(1);
ui->tableWidget->insertColumn(0);
ui->tableWidget->insertColumn(1);
ui->tableWidget->setItem(0, 0, new TEST("测试1"));
ui->tableWidget->setItem(0, 1, new TEST("测试2"));
ui->tableWidget->item(0, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
EmojiWidget* lable = new EmojiWidget(QString(":/src/emoji/1.gif"));
ui->tableWidget->setCellWidget(1,0,lable);
//删除行的时候释放item
ui->tableWidget->removeRow(0);
ui->tableWidget->removeRow(0);
//仅仅释放item,不删除行
// ui->tableWidget->clear();
// ui->tableWidget->clearContents();
效果
构造TEST: "测试1"
构造TEST: "测试2"
构造
析构TEST "测试1"
析构TEST "测试2"
delete movie
delete EmojiWidget