Возможно ли добавление строк в корневой элемент 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() невозможно применить для корня дерева, а можно применять только для элементов, которые уже есть в дереве. А как добавлять эти самые первичные элементы?
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 12 листопада 2024 р. 01:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 11:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 11:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Добрый день.
Всё сразу пока не читаю у вас в сообщении, времени немного нет, но по поводу clear() вот там ответ . Возможно остальные вопросы или проблемы у вас сразу отпадут.
Ну, коли так, то можно оставить первый конструктор.
Удивительно, почему в документации, в описании методов appendRow() и им подобных ничего не говорится что право владения передается в модель.
А вы почитайте документацию на QQuickItem, а потом загляните в заголовочный файл QQuickItem. Очень удивитесь.