0

您好我目前正在学习QT。我正在使用以下代码

QStringList list;
list << "item1" << "item2" << "item3" << "item4" << "item5";
ui.listView->setModel(new QStringListModel(list));

现在我的理解是,ui.listView->setModel它作为对堆上对象的引用传递。这个对象不需要删除吗?我应该在这里使用升压安全指针有什么建议吗?因为每次更新列表的内容时,我都必须调用最后一条语句来更新显示。

4

3 回答 3

0

是的,在这种情况下,您应该删除新的 QStringListModel(list),但是如果您稍微更改代码,它将由您的 listView 完成:

ui.listView->setModel(new QStringListModel(list, ui.listView));
于 2013-04-01T09:13:47.610 回答
0

很难从这么少的代码中分辨出来,但是是的,您正在堆上创建一个对象,您可能会丢失其地址,因此存在潜在的内存泄漏风险。您应该为自己定义一个指向对象的全局指针,并delete在需要新指针时定义它。
更好的是创建一个class包含对当前引用的小文件,QStringListModel并定义一些方法来创建一个新的,同时删除旧的。

class ListModelHolder {

 private:
    QStringListModel* model;

 public:
    ListModelHolder() { model = 0; }
    ~ListModelHolder() { if(model != 0) delete model; }

    set_model(QStringListModel* model) { this->model = model; }
    delete_model() { if(this->model) delete this->model; this->model = 0; }  
  };

举个例子。您可以将此对象保持在全局范围内或根据需要保持在全局范围内。

于 2013-04-01T09:16:39.870 回答
0

QListView::setModel不获取模型或选择模型的所有权,除非模型的父级是列表视图。这是因为一个模型可以在几个不同的视图之间共享。这意味着通常由您来照顾模型的生命并手动删除它。

我建议您自己管理它,并使用指向您班级中的模型的指针。这也将使您能够修改模型使用的字符串列表。

于 2013-04-01T09:16:52.843 回答