我有下一个问题,我使用Qt 5.5,并使用C ++和Qml创建一个应用程序,但是在一个Gui中,每秒更新一个模型,内存增长并增长内存,我如何能够阻止增长或管理记忆。
该应用程序工作正常,但问题出在Gui(页面)中,其中更新了一组模型并且每秒刷新gui(发布帖子并且答案更新模型),在这种情况下几分钟内存开始增长(显然没有限制),我将模型更改为C ++(原始版本在qml中,更改为QQmlListProperty类,就像我在这里发布代码),但我没有改变内存使用情况,我尝试在更新过程的每个方法中使用动态对象,结果相同,最后我尝试断开对象的一些通知(只有必需品),但是对内存的控制也失败了。
这里是C ++ QQmlListProperty(QmlListBombs)的标题
class QmlListBombs:public QObject{
Q_OBJECT
Q_PROPERTY(QQmlListProperty<BombModel> bombs READ bombs CONSTANT)
Q_CLASSINFO("DefaultProperty", "bombs")
public:
QmlListBombs(QObject *parent=0);
QQmlListProperty<BombModel> bombs();
static void append_bomb(QQmlListProperty<BombModel> *list, BombModel *bmb);
static BombModel *bombAt(QQmlListProperty<BombModel> *property, const int index);
private:
QList<BombModel*> m_bombs;
signals:
void bombsChanged();
应用程序运行时的炸弹数量总是相同的(因为属性是不变的)
这里的方法是bombsAt和构造函数更多
//QmlListBombs.cpp
//constructor
QmlListBombs::QmlListBombs(QObject *parent):QObject(parent)
{}
QQmlListProperty<BombModel> QmlListBombs::bombs() {
return QQmlListProperty<BombModel>this,&m_bombs,&QmlListBombs::bombsSize, &QmlListBombs::bombAt);
}
//append function, i not use this funcion to append to list in C++
void QmlListBombs::append_bomb(QQmlListProperty<BombModel> *list, BombModel *bmb){
QmlListBombs *bmbsList=qobject_cast<QmlListBombs *>(list->object);
if(bmbsList){
bmb->setParent(bmbsList);
bmbsList->m_bombs.append(bmb);
}
}
void QmlListBombs::insertBomb(){
BombModel *newBomb=new BombModel(island);
newBomb->setParent(this);
m_bombs.append(newBomb);
}
BombModel* QmlListBombs::bombAt(QQmlListProperty<BombModel> *list, const int index){
return static_cast< QList<BombModel *> *>(list->data)->at(index);
}
int QmlListBombs::bombsSize(QQmlListProperty<BombModel> *list){
return static_cast< QList<BombModel *> *>(list->data)->size();
}
//update bomb method, the qjsonobject is from the answer from remote server request
void QmlListBombs::updateBombs(const QJsonObject &reqStatusPumps){
int index=0;
QJsonObject arrayDataStatusReq=reqStatusPumps.value("pumpsList").toObject();
while(index<sizeQmlListBombs()){
if(m_bombs.at(index)->getStatusBomb()!=arrayDataStatusReq.value( m_bombs.at(index)->getPumpNumber() ).toInt())
m_bombs.at(index)->updateStatusPump( arrayDataStatusReq.value( m_bombs.at(index)->getPumpNumber() ).toInt() );
index++
}
}
int QmlListBombs::sizeQmlListBombs() const{
return m_bombs.size();
}
BombModel的标题和部分方法:
class BombModel: public QObject{
Q_OBJECT
Q_PROPERTY(QString numberBomb READ getPumpNumber CONSTANT)
Q_PROPERTY(int status READ getStatusBomb NOTIFY statusChange)
Q_PROPERTY(QString statusName READ getStatusName NOTIFY statusNameChange);
public:
void updateStatusPump(const quint16 &_statusPump){
if(this->status!=_statusPump){
this->status=_statusPump;
changeStatusName();//this function are only a switch where the status are evaluated
emit statusChange();
emit statusNameChange();
}
}
int getStatusBomb() const{
return this->status;
}
QString getStatusName() const{
return this->statusName;
}
void BombModel::changeStatusName(){
switch(status){
case 0:
statusName="Out";
break;
case 1:
statusName="Free";
break;
case 2:
statusName="Ocuped";
break;
...
...
default:
statusName="Error";
break;
}
private:
QString numberBomb;
int status;
QString statusName;
signals:
void statusChange();
void statusNameChange();
从之前的型号中只有一些信号,因为有些数据(如numberBomb,永远不会改变,只会改变状态和statusName)。
在主对象中,我将QQmlListProperty列表声明为上下文属性。
view->rootContext();->setContextProperty(QString("listBombs"), listBombs);
获得实际状态的功能是:
QByteArray responseStatus=catchStatus( jsonStatusBombs );
就像我说之前我没有可视化问题一样,更新我的问题就是使用内存。
这是我的Qml文件:
GridView{
width: parent.width; height: parent.height;
anchors.top: parent.top;
cellWidth: 174; cellHeight: 117;
id: arrayBombs;
model: listBombs.bombs;
delegate: BombModel{
numberBomb: model.numberBomb;
statusBomb: model.status;
statusText: model.statusName;
}
}