您好,我目前正在学习QT。 我使用以下代码
QStringList list;
list << "item1" << "item2" << "item3" << "item4" << "item5";
ui.listView->setModel(new QStringListModel(list));
现在我的理解是ui.listView->setModel
作为对堆上对象的引用传递。这个对象不需要删除吗?我应该在这里使用升压安全指针的任何建议吗?由于每次更新列表的内容时,我都必须调用最后一个语句来更新显示。
答案 0 :(得分:0)
是的,在这种情况下你应该删除新的QStringListModel(列表),但如果你稍微更改你的代码,它将由你的listView完成:
ui.listView->setModel(new QStringListModel(list, ui.listView));
答案 1 :(得分: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; }
};
仅作为一个例子。您可以将此对象保留在全局范围内,也可以根据需要保持全局。
答案 2 :(得分:0)
QListView::setModel不会获取模型或选择模型的所有权。这是因为模型可以在几个不同的视图之间共享。这意味着通常由您来照顾生活模型并手动删除它。
我建议您自己管理,并指向您班级中的模型。这也可以让您修改模型使用的字符串列表。