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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [Решено]Обновление модели  (Прочитано 10023 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« : Сентябрь 17, 2013, 12:05 »

Подскажите, возможно ли обновление модели, но так чтобы
итемы в ней не сворачивались???
А то если добавляешь элемент в модель, надо заново разворачивать ее с корня, это не удобно.
« Последнее редактирование: Сентябрь 19, 2013, 11:17 от demaker » Записан
mutineer
Гость
« Ответ #1 : Сентябрь 17, 2013, 12:07 »

делать не beginResetModel(), а beginInsertRows() при добавлении элемента
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #2 : Сентябрь 17, 2013, 12:21 »

делать не beginResetModel(), а beginInsertRows() при добавлении элемента

А данные???
Или они автоматически подтянуться?
Записан
mutineer
Гость
« Ответ #3 : Сентябрь 17, 2013, 12:22 »

Что "а данные"? Не понял вопроса
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #4 : Сентябрь 17, 2013, 12:29 »

При формирование модели
Код:
QVariant ModelBrowser::data(const QModelIndex &index, int role) const

c ее помощью мы отображаем данные.

А когда я добавил элемент в модель, то данные автоматически подтянуться?
Записан
mutineer
Гость
« Ответ #5 : Сентябрь 17, 2013, 12:30 »

опять ниче не понял. Куда подтянутся?
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #6 : Сентябрь 17, 2013, 12:33 »

В модель
Записан
mutineer
Гость
« Ответ #7 : Сентябрь 17, 2013, 12:37 »

нет, в модель ты их должен добавить сам, как и до этого. Но вместо beginResetModel()/endResetModel() надо использовать beginInsertRows()/endInsertRows() для оповещения view
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #8 : Сентябрь 17, 2013, 12:49 »

Классно
т.е
Код:
void QAbstractItemModel::beginInsertRows ( const QModelIndex & parent, int first, int last )
просто добавляет строчку
а индекс, и все прочее делайте сами
Записан
mutineer
Гость
« Ответ #9 : Сентябрь 17, 2013, 12:55 »

Он не добавляет строчку, он извещает вью о том, что в модель добавились данные
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #10 : Сентябрь 17, 2013, 13:13 »

сделал вот так
Код
C++ (Qt)
void TreeModelBrowser::updateModel(QModelIndex index)
{
   int row =  rowCount(index);
   row++;
   beginInsertRows(index,row,row);
   endInsertRows();
}
 
все бы ничего
только

TreeModelBrowser имеет древовидную структуру
и прежде чем у меня добавленный элемент модели у меня отображается во view
нужно свернуть все дерево, а потом заново его раскрыть.
Записан
Bepec
Гость
« Ответ #11 : Сентябрь 17, 2013, 13:17 »

Гы...

Begin
// действия с данными
End
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #12 : Сентябрь 17, 2013, 13:23 »

Гы...

Begin
// действия с данными
End
Код
C++ (Qt)
QVariant TreeModelBrowser::data(const QModelIndex &index, int role) const
{
   QObject*obj;
   if(!index.isValid())
       obj = base;
   else
       obj = reinterpret_cast<QObject*>(index.internalPointer());
 
   if(role == Qt::DisplayRole)
   {
       if(index.column() == 0 && QVariant(obj->metaObject()->className()).toString() == "Base")
       {
           Base*b =  dynamic_cast<Base*>(obj);
           return b->str;
       }
       if(index.column() == 1 && QVariant(obj->metaObject()->className()).toString() == "Station")
       {
           Station*s =  dynamic_cast<Station*>(obj);
           return s->str;
       }
       else  if(index.column() == 2 && QVariant(obj->metaObject()->className()).toString() == "Device")
       {
           Device*d =  dynamic_cast<Device*>(obj);
           return d->str;
       }
     return QVariant();
}
 

Это не будет работать?
Записан
Bepec
Гость
« Ответ #13 : Сентябрь 17, 2013, 13:38 »

Кхм. Возможно вы что-то не понимаете в model-view.

data будет работать.

Чтобы View адекватно реагировало на изменение данных в модели необходимо извещать view об изменениях.

Специально для этого есть пары функции beginInsertRows/Columns, beginRemoveColumns/Rows.
Собственно операции нужно производить в промежутке между begin и end.

Код:
//Вставляем данные в модель
void insert(QString data)
{
// Оповещаем view о том, что будет вставлено N записей.
beginInsertRows(*);
// далее добавляем в хранилище, допустим будет listData_
listData.append(data);
// Оповещаем view о том, что данные можно забирать
endInsertRows();
}

PS или я опять вас не так понял. Тогда что со мной твориться О_о
Записан
mutineer
Гость
« Ответ #14 : Сентябрь 17, 2013, 13:42 »

сделал вот так
Код
C++ (Qt)
void TreeModelBrowser::updateModel(QModelIndex index)
{
   int row =  rowCount(index);
   row++;
   beginInsertRows(index,row,row);
   endInsertRows();
}
 
все бы ничего
только

TreeModelBrowser имеет древовидную структуру
и прежде чем у меня добавленный элемент модели у меня отображается во view
нужно свернуть все дерево, а потом заново его раскрыть.

Я вот не вижу тут никакого нового элемента
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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