Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
x
6 декабря 2018 г. 10:50

Возможно ли добавление строк в корневой элемент QStandardItemModel с помощью insertRows()?

модель, дерево, индекс, корень, элемент

Написал я конструктор модели, унаследованный от QStandardItemModel . Модель подразумевается древовидная. В нем shortcutManager.availableSection - просто QStringList с названиями разделов «верхнего» уровня:


ShortcutSettingsModel::ShortcutSettingsModel(QObject *parent) : QStandardItemModel(parent)
{
    // Создание разделов
    foreach(QString sectionName, shortcutManager.availableSection) {
        QStandardItem *sectionItem=new QStandardItem(sectionName);
        this->appendRow(sectionItem);
    }
}

Конструктор работает, строки в виде появляются.

А потом думаю: нет, эдак у меня память потечет, потому что если сделать clean() в деструкторе, то очистится модель, а удалятся ли из кучи вставленные в нее QStandardItem - неизвестно. Придется городить рекурсивную очистку элементов, ну его нафиг.

Поэтому переписал конструктор вот так:


ShortcutSettingsModel::ShortcutSettingsModel(QObject *parent) : QStandardItemModel(parent)
{
    // Создание разделов
    int nSection=shortcutManager.availableSection.size(); // Количество разделов

    this->insertRows(0, nSection, QModelIndex()); // Вставка строк для разделов

    for(int i=0; i<nSection; ++i) {
        QModelIndex index=this->index(i, 0);

        QString sectionName=shortcutManager.availableSection.at(i);
        this->setData(index, sectionName); // Установка значения строки
    }
}

Но с таким кодом строк дерева в виде не видно.

Я подозреваю, что проблема в методе insertRows() . Третьим параметром он принимает индекс элемента, для которого создаются «подчиненные» элементы. Проблема в том, в концепции QStandardItemModel нет специального индекса для корня дерева. Есть только невалидный индекс, и предполагается, что ячейки первого уровня просто имеют невалидный индекс родителя.

Тогда возникает вопрос: а как блин создать ячейки первого уровня, если insertRows() требует индекс корневого элемента, но у нас его нет? Я пробую указать невалидный индекс как QModelIndex() , это прокатывает при компиляции, но во время работы толку от этого индекса нет.

Еще заметил, что когда крутится цикл, конструкция


this->index(i, 0)

все время возвращает одно и тоже значение, несмотря на то, что i меняется.

Получается, что метод insertRows() невозможно применить для корня дерева, а можно применять только для элементов, которые уже есть в дереве. А как добавлять эти самые первичные элементы?


3

Добрый день.

Всё сразу пока не читаю у вас в сообщении, времени немного нет, но по поводу clear() вот там ответ . Возможно остальные вопросы или проблемы у вас сразу отпадут.

0
x

Когда объект QStandardItem передаётся в QStandardItemModel , то права собственности на данные объекты передаются в модель. И при вызове метода clear модель автоматически удаляет эти объекты из памяти.


Ну, коли так, то можно оставить первый конструктор.

Удивительно, почему в документации, в описании методов appendRow() и им подобных ничего не говорится что право владения передается в модель.


0

А вы почитайте документацию на QQuickItem, а потом загляните в заголовочный файл QQuickItem. Очень удивитесь.

0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
НБ
15 февраля 2019 г. 13:09
Николай Булахтин

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
НБ
15 февраля 2019 г. 13:03
Николай Булахтин

C++ - Тест 002. Константы

  • Результат:25баллов,
  • Очки рейтинга-10
НБ
15 февраля 2019 г. 13:01
Николай Булахтин

C++ - Тест 001. Первая программа и типы данных

  • Результат:73баллов,
  • Очки рейтинга1
Последние комментарии
V
14 февраля 2019 г. 18:41
Vlad15007

Спасибо огромное! Заработало!
А
12 февраля 2019 г. 9:26
Александр90

Сам разборался, спасибо.
А
12 февраля 2019 г. 8:19
Александр90

День добрый! Можешь выложить форму mainwindow.ui от урока? Заранее спасибо
11 февраля 2019 г. 10:51
Евгений Легоцкой

Нет, у меня проблема с жёстким диском случилась, занимался восстановлением ПК, ещё пару вечеров придётся этим заниматься, увы.
Сейчас обсуждают на форуме
15 февраля 2019 г. 21:22
IscanderChe

Доброй ночи.Скромно напоминаю о своём вопросе...
15 февраля 2019 г. 15:36
Евгений Легоцкой

Ну я тут нашёл одно решение, но сам его не проверял. Вам нужно помещать фамилии скорее всего в ячейки заголовка, и потом просто перерисовывать их QHeaderView * header = m_ui->tableWidget...
15 февраля 2019 г. 7:53
Евгений Легоцкой

Добрый день! Не работал с remoteobjects, поэтому глянул документацию, чтобы рассмотреть, что это за зверь. После просмотра документации сложилось стойкой впечатление, что это вполне возм...
m
14 февраля 2019 г. 18:28
mr_roman

Нашел решение на Java. Удалось интегрировать в проект сервиса на Qt, теперь из Qt запускаю Java-код акселерометра.
14 февраля 2019 г. 11:00
Евгений Легоцкой

ok. I see. You changed related name Try this {% if goal.joined.all|user_in:request.user %}
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы