From ecee7e65ce9836bfcfedc8ea09737ea082c765f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 7 Jun 2012 15:29:09 +0200 Subject: [PATCH] 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) --- YACReaderLibrary/db/tablemodel.cpp | 4 ++-- YACReaderLibrary/db/treemodel.cpp | 19 +++++++++++-------- YACReaderLibrary/library_window.cpp | 21 ++++++++++++--------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/YACReaderLibrary/db/tablemodel.cpp b/YACReaderLibrary/db/tablemodel.cpp index 18884915..edee0d89 100644 --- a/YACReaderLibrary/db/tablemodel.cpp +++ b/YACReaderLibrary/db/tablemodel.cpp @@ -144,7 +144,7 @@ void TableModel::setupModelData(unsigned long long int folderId,QSqlDatabase & d { //QFile f(QCoreApplication::applicationDirPath()+"/performance.txt"); //f.open(QIODevice::Append); - emit(beforeReset()); + beginResetModel(); //QElapsedTimer timer; //timer.start(); 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"; db.close(); _database = db; - emit(reset()); + endResetModel(); //f.close(); } diff --git a/YACReaderLibrary/db/treemodel.cpp b/YACReaderLibrary/db/treemodel.cpp index 2e110b64..1bc10c3f 100644 --- a/YACReaderLibrary/db/treemodel.cpp +++ b/YACReaderLibrary/db/treemodel.cpp @@ -198,7 +198,7 @@ int TreeModel::rowCount(const QModelIndex &parent) const void TreeModel::setupModelData(QString path) { - emit(beforeReset()); + beginResetModel(); if(rootItem != 0) delete rootItem; //TODO comprobar que se libera bien la memoria filterEnabled = false; @@ -220,7 +220,7 @@ void TreeModel::setupModelData(QString path) setupModelData(selectQuery,rootItem); _database.close(); - emit(reset()); + endResetModel(); } @@ -249,7 +249,7 @@ void TreeModel::setupModelData(QSqlQuery &sqlquery, TreeItem *parent) void TreeModel::setupFilteredModelData() { - emit(beforeReset()); + beginResetModel(); //TODO hay que liberar memoria de anteriores filtrados @@ -285,7 +285,8 @@ void TreeModel::setupFilteredModelData() selectQuery.exec(); setupFilteredModelData(selectQuery,rootItem); _database.close(); - emit(reset()); + + endResetModel(); } void TreeModel::setupFilteredModelData(QSqlQuery &sqlquery, TreeItem *parent) @@ -381,7 +382,7 @@ void TreeModel::setFilter(QString filter, bool includeComics) void TreeModel::resetFilter() { - emit(beforeReset()); + beginResetModel(); filter = ""; includeComics = false; //TODO hay que liberar la memoria reservada para el filtrado @@ -389,10 +390,12 @@ void TreeModel::resetFilter() filteredItems.clear(); TreeItem * root = rootItem; rootItem = rootBeforeFilter; //TODO si no se aplica el filtro previamente, esto invalidaría en modelo - //if(root !=0) - // delete root; + if(root !=0) + delete root; + rootBeforeFilter = 0; filterEnabled = false; - emit(reset()); + endResetModel(); + } \ No newline at end of file diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index a3965cfb..ca28ad26 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -564,8 +564,8 @@ void LibraryWindow::loadLibrary(const QString & name) { index = 0; sm->clear(); - foldersView->setModel(NULL); //TODO comprobar pq no sirve con usar simplemente las señales beforeReset y reset - comicView->setModel(NULL); + //foldersView->setModel(NULL); //TODO comprobar pq no sirve con usar simplemente las señales beforeReset y reset + //comicView->setModel(NULL); dm->setupModelData(path); foldersView->setModel(dm); @@ -604,6 +604,15 @@ void LibraryWindow::loadLibrary(const QString & name) void LibraryWindow::loadCovers(const QModelIndex & mi) { + + unsigned long long int folderId = 0; + if(mi.isValid()) + { + TreeItem *item = static_cast(mi.internalPointer()); + folderId = item->id; + } + + //cambiado de orden, ya que al llamar a foldersFilter->clear() se invalidan los model index if(foldersFilter->text()!="") { //setFoldersFilter(""); @@ -620,13 +629,7 @@ void LibraryWindow::loadCovers(const QModelIndex & mi) column = mi.column(); } - unsigned long long int folderId = 0; - if(mi.isValid()) - { - TreeItem *item = static_cast(mi.internalPointer()); - folderId = item->id; - } - comicView->setModel(NULL); + //comicView->setModel(NULL); dmCV->setupModelData(folderId,dm->getDatabase()); comicView->setModel(dmCV); //TODO automatizar (valorar si se deja al modelo)