• 10039阅读
  • 4回复

[讨论]qml,用listview显示QList<New..>中30w条数据,删除QList<..>,应用占的内存没有减少,是什么原因 [复制链接]

上一主题 下一主题
离线bobbyhz
 
只看楼主 倒序阅读 楼主  发表于: 2012-02-14
xxxxxx.h
{
...
Q_PROPERTY( QList<QObject*> xmlNodeList READ getXmlNodeList WRITE setXmlNodeList NOTIFY xmlNodeListChanged)
public:
....
        QList<QObject*> getXmlNodeList();
               void setXmlNodeList(QList<QObject*> xmlNodeList);
...
signals:
.....
    void xmlNodeListChanged()
....
private:
.....
  QList<QObject*> xmlNodeList;
.....
public slots:
    void test();
.....
}
--------------------------------------------------------------------------------------------------------------
xxxxxx.cpp  
xxxxx::xxxxx(int &argc, char **argv):    QApplication(argc,argv)
{
.....
    for( int i = 1; i < 200000;i++)
    {
          xmlNodeList.append(new XmlNode("1","test1","test11"));
          xmlNodeList.append(new XmlNode("2","test2","test21"));
         xmlNodeList.append(new XmlNode("3","test3","test31"));
     }
   ......
   context->setContextProperty("thisApp",this);
     ....
    viewer.setSource (QUrl("ui/main.qml"));
    ....
}

QList<QObject*> xxxxxx::getXmlNodeList(){
            return this->xmlNodeList;
}
void xxxxx::setXmlNodeList(QList<QObject*> xmlNodeList)
{  if(this->xmlNodeList !=xmlNodeList)    
  {        
   this->xmlNodeList=xmlNodeList;
   emit xmlNodeListChanged();
    }
}
void xxxxxx::test()
{    
  qDebug()<<"test............";    
  QList<QObject*> xmlNodeList1;    
  QList<QObject*> xmlNodeListT = xmlNodeList;    
  setXmlNodeList(xmlNodeList1);    
  qDeleteAll(xmlNodeListT.begin(),xmlNodeListT.end());    
  xmlNodeListT.clear();    
  qDebug()<<"o------------------------k";
}
--------------------------------------------------------------------------------------------------------------
main.qml
{
.....
Rectangle {        
   x:700        
   y:150        
   width: 200        
   height: 100        
   color:"blue"            
   ListView {                
     width: 200; height:200                
     anchors.fill: parent                
     model: thisApp.xmlNodeList                
     delegate: Rectangle                
       {                    
       height: 25                    
       width: 100                    
       Column                    
         {                        
         spacing: 40                        
         Text { text: modelData.name +"|"                                    
                +modelData.value +"|"                                    
                +modelData.lable                        
           }                    
       }                
     }            
    }        
  }
......
  Rectangle{          
     x:600            
     y:600            
     width: 80            
     height: 25            
     color:"red"            
     Text {              
        id: btn_xml              
        anchors.centerIn: parent              
        text: "测试内存"            
        }            
     MouseArea{              
          anchors.fill: parent                  
          onClicked: {                      
          thisApp.test()                                  
          }            
      }    
  
   }....
}
--------------------------------------------------------------------------------------------------------------
qml显示30w条数据,测试目的是否把QList<new Qobject*..内存空间是否清除;
1.经测试,点击“test()”,其中“qDeleteAll(xmlNodeListT.begin(),xmlNodeListT.end());    xmlNodeListT.clear();”已经把xmlNodeList清空,但是内存已经占了80多M;
2.如果 把qml中“model: thisApp.xmlNodeList“ 去掉,数据不在qml中显示,点击“test()”,运行的结果为12M。
请各位看看,是不是qml中的model,造成的这个内存为清空的现象,有什么方法清空内存
离线bobbyhz
只看该作者 1楼 发表于: 2012-02-15
Re:qml,用listview显示QList<New..>中30w条数据,删除QList<..>,应用占的内存没有减少,是 ..
自己先顶一个,问题比较大,请各位帮忙
离线bobbyhz
只看该作者 2楼 发表于: 2012-02-16
Re:qml,用listview显示QList<New..>中30w条数据,删除QList<..>,应用占的内存没有减少,是 ..
自己在顶一下,不知道大家有没有遇到过内存没有释放的情况,感觉是qml这块没有做处理
离线toby520

只看该作者 3楼 发表于: 2013-01-17
Re:qml,用listview显示QList<New..>中30w条数据,删除QList<..>,应用占的内存没有减少,是 ..
QML listview内存泄露确认严重,没有得到很好的释放,求助大侠
QtQML多多指教开发社区 http://qtclub.heilqt.com
将QtCoding进行到底
关注移动互联网,关注金融
开发跨平台客户端,服务于金融行业
专业定制界面
群号:312125701   373955953(qml控件定做)
离线pxiao_xiao

只看该作者 4楼 发表于: 2013-03-01
Re:qml,用listview显示QList<New..>中30w条数据,删除QList<..>,应用占的内存没有减少,是 ..
Note: There is no way for the view to know that the contents of a QList have changed. If the QList changes, it will be necessary to reset the model by calling QDeclarativeContext::setContextProperty() again.
也就是说 C++里清空List时 QML是无法知道的  也就说 QML的内存需要手动清理
快速回复
限100 字节
 
上一个 下一个