Правильное удаление объектов из ++ модели ассоциированной со списком в 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.. но оно не работает
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!
Пікірлер
- Akiv Doros
- Қар. 11, 2024, 2:58 Т.Қ.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:50ұпай,
- Бағалау ұпайлары-4
- molni99
- Қаз. 26, 2024, 1:37 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:80ұпай,
- Бағалау ұпайлары4
- molni99
- Қаз. 26, 2024, 1:29 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:20ұпай,
- Бағалау ұпайлары-10
Добрый день
Попробуйте использовать метод deleteLater() у объектов Data . В этом случае удаление происзодит немного позже, но уже тогда, когда другие части программы не ссылаются на объект и не используют его.
Да, спасибо порешалось таким образом:
удаление одного
удаление всех