Правильное удаление объектов из ++ модели ассоциированной со списком в QML

Qt, C++, QML, QObject, ListView

Доброго дня! Вопрос как правильно удалять данные из модели сделанной таким образом:
https://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html пример с QObjectList-based Model.
В плюсовой части есть список QList lstData; в который добавляется структура типа

  1. class Data: public QObject
  2. {
  3.    Q_OBJECT
  4.  
  5.    Q_PROPERTY(...)
  6.  
  7.    public:
  8.        Data() {}
  9.  
  10.       ~Data()
  11.        {
  12.              qDebug() << "~Data";
  13.        }
  14.  
  15. ....
  16.  
  17. };

добавляется lstData.append(new Data());
после этого делается context->setContextProperty("M_Data", QVariant::fromValue(lstData));

в QML части:

  1. ListView
  2. {
  3.      id: idTableBody
  4.      anchors { fill: parent }                
  5.      clip: true
  6.      model: M_Data
  7. }

и все вроде ок, когда я редактирую/добавляю данные в модель, а потом делаю обновление как написано по ссылке context->setContextProperty("M_Data", QVariant::fromValue(lstData));
интересности начинаются, когда я пытаюсь удалить данные..
чтобы удалить одну строку делаю так

  1. for(int i = 0; i < lstData.count(); ++i)
  2.    {
  3.        auto *data= dynamic_cast<Data*>(lstData[i]);
  4.        if(data)
  5.        {
  6.            if(data->getNumber() == delNumberData)
  7.            {
  8.                lstData.removeAt(i);
  9.                delNumberReason = -1;
  10.                return true;
  11.            }
  12.        }
  13.    }

для удаления всех строк вызываю просто lstData.clear() и это работает, НО.. я не вижу, чтобы вызывался деструктор объекта!
removeAt(); и clear() вроде как и не должны его вызывать.. ок, тогда я делаю
delete lstData.takeAt(i); для удаления одной строчки и qDeleteAll(lstData); и для удаления всего списка и при этом деструктор вызывается с....(внимание!) обязательным крашем программы! :)
и вот собственно как это разрулить счастье, кто отвечает за освобождение памяти.. и как это правильно сделать?

P.S: Посдказали еще сделать деструктор virtual в Data, но это не сильно помогло в том плане, что оно крашется теперь не каждый раз, а как-то рандомно при вызове qDeleteAll(lstData). Да и виртуальный деструктор нужен в базовом классе, для корректного удаления производных классов через указатель на базовый. Базовым классом для моего класса Data является QObject, а у него деструктор виртуальный! Поэтому вроде как все должно работать было и без добавления virtual в мой класс Data.. но оно не работает

2

Do you like it? Share on social networks!

2
Evgenii Legotckoi
  • Jan. 24, 2020, 2:24 p.m.

Добрый день

Попробуйте использовать метод deleteLater() у объектов Data . В этом случае удаление происзодит немного позже, но уже тогда, когда другие части программы не ссылаются на объект и не используют его.

    ВЖ
    • Jan. 26, 2020, 3:11 p.m.
    • The answer was marked as a solution.

    Да, спасибо порешалось таким образом:
    удаление одного

    1. for(int i = 0; i < lstData.count(); ++i)
    2. {
    3. auto *data= dynamic_cast<Data*>(lstData[i]);
    4. if(data)
    5. {
    6. if(data->getNumber() == delNumber)
    7. {
    8. lstData[i]->deleteLater();
    9. lstData.removeAt(i);
    10. delNumber = -1;
    11. context->setContextProperty("M_Data", QVariant::fromValue(lstData));
    12. return true;
    13. }
    14. }
    15. }

    удаление всех

    1. context->setContextProperty("M_Data", QVariant::fromValue(QList<QObject*>()));
    2. qDeleteAll(lstData);
    3. lstData.clear();

      Comments

      Only authorized users can post comments.
      Please, Log in or Sign up
      • Last comments
      • AK
        April 1, 2025, 11:41 a.m.
        Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
      • Evgenii Legotckoi
        March 9, 2025, 9:02 p.m.
        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
      • VP
        March 9, 2025, 4:14 p.m.
        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
      • ИМ
        Nov. 22, 2024, 9:51 p.m.
        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
      • Evgenii Legotckoi
        Oct. 31, 2024, 11:37 p.m.
        Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup