首页| 论坛| 消息

标题:求助!用setcontextproperty重置gridview的model,运行多次后程序崩溃
作者:inanity
日期:2017-12-20 11:05
内容:

主要想实现的功能是:界面中用gridview画视图,gridview的model数据是由QQmlContext::setcontextproperty加载的QList。但修改QList中元素后,用setcontextproperty重置模型时,程序会崩溃。
有几个问题:
1.程序是用setcontextproperty重置模型后几次才崩溃的,也就是能运行N次setcontextproperty,界面也能显示出QList中的数据。
2.每次setcontextproperty后,程序内存会涨2-3M左右,而且内存值不会往下掉(也就是说setcontextproperty会申请一些空间,还不会释放)。
3.qt creator的debug模式是不是有内存限制,内存涨到500M左右有些要用内存操作就会保存,比如加载图片用的QImage。4.是否用继承QAbstractListModel比使用QList来加载Model数据好些。

以下是简化过的部分代码:
main.qml
GridView{
id:gridview
...
model: templist
delegate: gridview_component
&nbs ..


#1 [小韩老师 12-20 20:44]
程序崩溃一般是内存分配不好造成的,打眼瞟一下这个
context->setContextProperty("templist",nullptr);
context->setContextProperty("templist", QVariant::fromValue(temp));
每次循环都注册一次templist,感觉很不合理。要把templist看做一个容器,容器就好比一个仓库,你的内容就是仓库里的货,你每次来了一批新货你是先把仓库拆了,再为新货建立一个仓库。
把context->setContextProperty("templist", QVariant::fromValue(temp));放到构造函数中,或者这个接收消息函数外初始化。 context->setContextProperty("templist",nullptr);函数删除,你每次就对指针指向的内容操作,消息增加新消息,删除旧消息
#2 [zxwmail 12-22 17:49]
,小韩老师讲的对。
#3 回 小韩老师 的帖子 [inanity 12-25 22:19]
小韩老师:
程序崩溃一般是内存分配不好造成的,打眼瞟一下这个
context->setContextProperty("templist",nullptr);
context->setContextProperty("templist", QVariant::fromValue(temp));
每次循环都注册一次templist,感觉很不合理。要把templist看做一个容器,容器就好比一个仓库,你的内容就是仓库里的货,你每次来了一批新货你是先把仓库拆了,再为新货建立一个仓库。
把context->setContextProperty("templist", QVariant::fromValue(temp));放到构造函数中,或者这个接收消息函数外初始化。 context->setContextProperty("templist",nullptr);函数删除,你每次就对指针指向的内容操作,消息增加新消息,删除旧消息
每次循环调用setContextProperty是为了重置model的数据。不然QML部分不知道templist中的数据已经修改了。

我发现删除掉qDeleteAll(temp);,程序能正常跑。所有有点疑问是:C++的temp传递到QML时是不是有内存上的联系,要在setContextProperty重置后才能将重置前temp中的数据释放掉。

现在程序先用保存旧的数据,只调用temp.clear();清空temp,没将数据释放,再在temp添加新数据,用setContextProperty重置model后,才调用qDeleteAll(qlistTemp); qlistTemp.clear();QList qlistTemp=temp;
temp.clear();
qsrand(time(0));
int max=qrand()%16+1;
for(int i=0;i
#4 [小韩老师 12-26 12:22]
1.首先最好用当然是使用QAbstractItemModel,这个是专门为模型设计的,安全高效,你说的这些问题都不会出;
2.你说数据没有更新是指增加的数量不更新还是每个条目里的内容不更新?要是数量没有很新,你就是原来是5个现在是4个,模型更新完了还是显示5个,那你就要手动更新了?要是你这次写进去的内容和上次的不一样,比如这次这个text new但是还是显示上一次的,那就是你的属性写的需要比较全把属性里增加notify的信号?自己去尝试一下吧
#5 回 小韩老师 的帖子 [inanity 12-26 16:54]
小韩老师:1.首先最好用当然是使用QAbstractItemModel,这个是专门为模型设计的,安全高效,你说的这些问题都不会出;
2.你说数据没有更新是指增加的数量不更新还是每个条目里的内容不更新?要是数量没有很新,你就是原来是5个现在是4个,模型更新完了还是显示5个,那你就要手动更新了?要是 .. (2017-12-26 12:22) 
谢谢

回复 发表
主题 版块