QT中在on_pushButton_clicked()槽函数内new创建的Model对象应如何销毁?
嗨,这个问题在QT的模型视图开发里挺常见的,我给你几个实用的解决方案,你可以根据自己的场景选:
利用QT的父子对象自动管理机制(最省心的方式)
创建Model的时候,直接把ui->tableView作为它的父对象,这样当tableView被销毁(比如窗口关闭时),QT的对象树会自动帮你销毁这个Model,完全不用手动写delete:void MainWindow::on_pushButton_clicked() { Model *model = new Model(ui->tableView); // 将tableView设为父对象 ui->tableView->setModel(model); }每次创建新Model前销毁旧Model(适合多次点击按钮更新模型的场景)
如果用户可能多次点击这个按钮,每次都创建新的Model,那旧的Model就会造成内存泄漏。这时候可以在创建新Model前,先获取tableView当前的Model并销毁:void MainWindow::on_pushButton_clicked() { // 获取当前的旧模型并销毁 QAbstractItemModel *oldModel = ui->tableView->model(); if (oldModel) { delete oldModel; } // 创建新模型并设置 Model *model = new Model; ui->tableView->setModel(model); }在窗口析构函数中统一销毁
如果你确定这个Model只会被设置一次,也可以在MainWindow的析构函数里手动销毁它:MainWindow::~MainWindow() { // 先销毁模型,再销毁ui delete ui->tableView->model(); delete ui; }
需要注意的是,QT的模型视图框架里,当你调用setModel()时,并不会自动接管旧Model的生命周期,所以一定要手动处理或者利用父子对象机制来避免内存泄漏哦。
备注:内容来源于stack exchange,提问作者jakra wut
相关产品推荐
相关产品推荐

