corregido bug en los modelos, no se trataba de emitir las se?ales beforeReset y reset

sino de llamar a los m?todos beginResetModel() y endesetModel() para invalidar el modelo

ahora ya se puede liberar la memoria interna de los modelos sin problemas (aunque siguen existiendo memory leaks)
This commit is contained in:
Luis Ángel San Martín 2012-06-07 15:29:09 +02:00
parent 0e59d311d4
commit ecee7e65ce
3 changed files with 25 additions and 19 deletions

View File

@ -144,7 +144,7 @@ void TableModel::setupModelData(unsigned long long int folderId,QSqlDatabase & d
{ {
//QFile f(QCoreApplication::applicationDirPath()+"/performance.txt"); //QFile f(QCoreApplication::applicationDirPath()+"/performance.txt");
//f.open(QIODevice::Append); //f.open(QIODevice::Append);
emit(beforeReset()); beginResetModel();
//QElapsedTimer timer; //QElapsedTimer timer;
//timer.start(); //timer.start();
qDeleteAll(_data); qDeleteAll(_data);
@ -165,7 +165,7 @@ void TableModel::setupModelData(unsigned long long int folderId,QSqlDatabase & d
//txtS << "TABLEMODEL: Tiempo de creación del modelo: " << timer.elapsed() << "ms\r\n"; //txtS << "TABLEMODEL: Tiempo de creación del modelo: " << timer.elapsed() << "ms\r\n";
db.close(); db.close();
_database = db; _database = db;
emit(reset()); endResetModel();
//f.close(); //f.close();
} }

View File

@ -198,7 +198,7 @@ int TreeModel::rowCount(const QModelIndex &parent) const
void TreeModel::setupModelData(QString path) void TreeModel::setupModelData(QString path)
{ {
emit(beforeReset()); beginResetModel();
if(rootItem != 0) if(rootItem != 0)
delete rootItem; //TODO comprobar que se libera bien la memoria delete rootItem; //TODO comprobar que se libera bien la memoria
filterEnabled = false; filterEnabled = false;
@ -220,7 +220,7 @@ void TreeModel::setupModelData(QString path)
setupModelData(selectQuery,rootItem); setupModelData(selectQuery,rootItem);
_database.close(); _database.close();
emit(reset()); endResetModel();
} }
@ -249,7 +249,7 @@ void TreeModel::setupModelData(QSqlQuery &sqlquery, TreeItem *parent)
void TreeModel::setupFilteredModelData() void TreeModel::setupFilteredModelData()
{ {
emit(beforeReset()); beginResetModel();
//TODO hay que liberar memoria de anteriores filtrados //TODO hay que liberar memoria de anteriores filtrados
@ -285,7 +285,8 @@ void TreeModel::setupFilteredModelData()
selectQuery.exec(); selectQuery.exec();
setupFilteredModelData(selectQuery,rootItem); setupFilteredModelData(selectQuery,rootItem);
_database.close(); _database.close();
emit(reset());
endResetModel();
} }
void TreeModel::setupFilteredModelData(QSqlQuery &sqlquery, TreeItem *parent) void TreeModel::setupFilteredModelData(QSqlQuery &sqlquery, TreeItem *parent)
@ -381,7 +382,7 @@ void TreeModel::setFilter(QString filter, bool includeComics)
void TreeModel::resetFilter() void TreeModel::resetFilter()
{ {
emit(beforeReset()); beginResetModel();
filter = ""; filter = "";
includeComics = false; includeComics = false;
//TODO hay que liberar la memoria reservada para el filtrado //TODO hay que liberar la memoria reservada para el filtrado
@ -389,10 +390,12 @@ void TreeModel::resetFilter()
filteredItems.clear(); filteredItems.clear();
TreeItem * root = rootItem; TreeItem * root = rootItem;
rootItem = rootBeforeFilter; //TODO si no se aplica el filtro previamente, esto invalidaría en modelo rootItem = rootBeforeFilter; //TODO si no se aplica el filtro previamente, esto invalidaría en modelo
//if(root !=0) if(root !=0)
// delete root; delete root;
rootBeforeFilter = 0; rootBeforeFilter = 0;
filterEnabled = false; filterEnabled = false;
emit(reset()); endResetModel();
} }

View File

@ -564,8 +564,8 @@ void LibraryWindow::loadLibrary(const QString & name)
{ {
index = 0; index = 0;
sm->clear(); sm->clear();
foldersView->setModel(NULL); //TODO comprobar pq no sirve con usar simplemente las señales beforeReset y reset //foldersView->setModel(NULL); //TODO comprobar pq no sirve con usar simplemente las señales beforeReset y reset
comicView->setModel(NULL); //comicView->setModel(NULL);
dm->setupModelData(path); dm->setupModelData(path);
foldersView->setModel(dm); foldersView->setModel(dm);
@ -604,6 +604,15 @@ void LibraryWindow::loadLibrary(const QString & name)
void LibraryWindow::loadCovers(const QModelIndex & mi) void LibraryWindow::loadCovers(const QModelIndex & mi)
{ {
unsigned long long int folderId = 0;
if(mi.isValid())
{
TreeItem *item = static_cast<TreeItem*>(mi.internalPointer());
folderId = item->id;
}
//cambiado de orden, ya que al llamar a foldersFilter->clear() se invalidan los model index
if(foldersFilter->text()!="") if(foldersFilter->text()!="")
{ {
//setFoldersFilter(""); //setFoldersFilter("");
@ -620,13 +629,7 @@ void LibraryWindow::loadCovers(const QModelIndex & mi)
column = mi.column(); column = mi.column();
} }
unsigned long long int folderId = 0; //comicView->setModel(NULL);
if(mi.isValid())
{
TreeItem *item = static_cast<TreeItem*>(mi.internalPointer());
folderId = item->id;
}
comicView->setModel(NULL);
dmCV->setupModelData(folderId,dm->getDatabase()); dmCV->setupModelData(folderId,dm->getDatabase());
comicView->setModel(dmCV); comicView->setModel(dmCV);
//TODO automatizar (valorar si se deja al modelo) //TODO automatizar (valorar si se deja al modelo)