Правильное удаление объектов из ++ модели ассоциированной со списком в QML
Qt, C++, QML, QObject, ListView
Доброго дня! Вопрос как правильно удалять данные из модели сделанной таким образом:
https://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html пример с QObjectList-based Model.
В плюсовой части есть список QList
class Data: public QObject { Q_OBJECT Q_PROPERTY(...) public: Data() {} ~Data() { qDebug() << "~Data"; } .... };
добавляется lstData.append(new Data());
после этого делается context->setContextProperty("M_Data", QVariant::fromValue(lstData));
в QML части:
ListView { id: idTableBody anchors { fill: parent } clip: true model: M_Data }
и все вроде ок, когда я редактирую/добавляю данные в модель, а потом делаю обновление как написано по ссылке context->setContextProperty("M_Data", QVariant::fromValue(lstData));
интересности начинаются, когда я пытаюсь удалить данные..
чтобы удалить одну строку делаю так
for(int i = 0; i < lstData.count(); ++i) { auto *data= dynamic_cast<Data*>(lstData[i]); if(data) { if(data->getNumber() == delNumberData) { lstData.removeAt(i); delNumberReason = -1; return true; } } }
для удаления всех строк вызываю просто lstData.clear() и это работает, НО.. я не вижу, чтобы вызывался деструктор объекта!
removeAt(); и clear() вроде как и не должны его вызывать.. ок, тогда я делаю
delete lstData.takeAt(i); для удаления одной строчки и qDeleteAll(lstData); и для удаления всего списка и при этом деструктор вызывается с....(внимание!) обязательным крашем программы! :)
и вот собственно как это разрулить счастье, кто отвечает за освобождение памяти.. и как это правильно сделать?
P.S: Посдказали еще сделать деструктор virtual в Data, но это не сильно помогло в том плане, что оно крашется теперь не каждый раз, а как-то рандомно при вызове qDeleteAll(lstData). Да и виртуальный деструктор нужен в базовом классе, для корректного удаления производных классов через указатель на базовый. Базовым классом для моего класса Data является QObject, а у него деструктор виртуальный! Поэтому вроде как все должно работать было и без добавления virtual в мой класс Data.. но оно не работает
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 11, 2024, 2:58 p.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 1:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 1:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10
Добрый день
Попробуйте использовать метод deleteLater() у объектов Data . В этом случае удаление происзодит немного позже, но уже тогда, когда другие части программы не ссылаются на объект и не используют его.
Да, спасибо порешалось таким образом:
удаление одного
удаление всех