Russian Qt Forum
Ноябрь 22, 2024, 03:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Добавление строк в QTableView (РЕШЕНО)  (Прочитано 6313 раз)
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« : Март 09, 2018, 14:35 »

Хранилищем данных в моей модели является некая самопальная структура (Типа StringList)
Когда я пытаюсь добавить строку в таблицу, я добавляю в эту структуру элемент средствами, не использующими Qt, Т.е. без всяких InsertRow. И данные добавляются (проверял), и rowCount() дает правильное значение, и запись в базу данных (тоже самопальную) происходит. Только вот визуально в таблице их нет. То есть Вьюха не знает, что строки добавлены. Я вставил логирование в метод модели date(), но там происходит обращение только до старого количества строк ( ind.row())
Qt 4.5.2. И методов beginResetModel() и endResetModel() нет. Есть modelReset(), reset() и modelAboutToBeReset(). Вопрос - как их грамотно использовать?
« Последнее редактирование: Март 14, 2018, 13:01 от Day » Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #1 : Март 09, 2018, 23:25 »

Я в тупике. Все эти методы - protected
tableView->reset() и tableView->update(QModelIndex()) никакого эффекта не дали.
Как же сообщить ему, что в модели появилась еще одна строка?
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #2 : Март 10, 2018, 00:34 »

Все получилось!!!
В моей модели, унаследованной от QAbstractTableModel просто метод
Код:
public:
void R() { reset(); }
Записан
Bepec
Гость
« Ответ #3 : Март 10, 2018, 02:38 »

Вьюха знает об обновлении только по сигналам модели.

Reset в данном случае - очень плохой метод, т.к. перетряхивает все данные модели.

Вам нужно использовать методы модели. Это стандартные методы модели, которые являются обёрткой для сигналов.

Для вставки новой строки beginInsert, endInsert. (row/column)

Код:
    beginInsertRows(index(rowCount(),0), rowCount(), rowCount()+ 1);
    // тут вставляете данные
    rootItem->appendChild(item);
    endInsertRows();
Для изменения уже существующих dataChanged.
Код:
    rootItem->child(row)->infoStruct.name = name;
    dataChanged(index(row,1),index(row,1));
Для удаления beginRemove, endRemove. (row/column)
Тут всё аналогично с инсертом.

Без использования этих методов модели бесполезны и даже вредны. Тут главное понять смысл их использования и потом всё легче лёгкого.


 
« Последнее редактирование: Март 10, 2018, 02:41 от Bepec » Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #4 : Март 10, 2018, 11:27 »

Верес, Большое спасибо за разъяснения!
Тут на меня какое-то затмение нашло. Смутило то, что все эти методы - protected. Видать, от перегрева. И не допер до простого. Наследуемся от QAbstactItemModel, и они все доступны!
А с применениями всех этих методов, да, буду разбираться.
Главное - я понял, что все эти методы можно применять только в методах моей модели
« Последнее редактирование: Март 10, 2018, 11:29 от Day » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 22.