Правильное удаление объектов из ++ модели ассоциированной со списком в 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.. но оно не работает
Do you like it? Share on social networks!
- Last comments
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Now discuss on the forum
- МАApril 1, 2025, 4:21 p.m.0ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
Добрый день
Попробуйте использовать метод deleteLater() у объектов Data . В этом случае удаление происзодит немного позже, но уже тогда, когда другие части программы не ссылаются на объект и не используют его.
Да, спасибо порешалось таким образом:
удаление одного
удаление всех