You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QT中在on_pushButton_clicked()槽函数内new创建的Model对象应如何销毁?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:04:28