Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Larry от Январь 26, 2011, 12:29



Название: Обновление модели и представления
Отправлено: Larry от Январь 26, 2011, 12:29
Добрый день, форумчане!У меня есть модель дерева унаследованная от qAbstractItemModel и представление QTreeView. Модель заполняется данными из бд. Все работает нормально, только при внесении новых данных в базу приходиться перезапускать программу, чтобы увидеть новые данные. Как можно обновить модель, чтобы данные можно было сразу видеть?


Название: Re: Обновление модели и представления
Отправлено: UVV от Январь 26, 2011, 13:04
QAbstractItemModel::reset()


Название: Re: Обновление модели и представления
Отправлено: Larry от Январь 26, 2011, 13:06
извините за тупой вопрос ;D, а ее тоже переопределить надо?


Название: Re: Обновление модели и представления
Отправлено: BRE от Январь 26, 2011, 13:08
Нужно разобраться с моделями и правильно добавлять данные.


Название: Re: Обновление модели и представления
Отправлено: UVV от Январь 26, 2011, 13:45
Нужно разобраться с моделями и правильно добавлять данные.

Тут немного сложнее ему будет, вероятно.
В этом случае ему нужно ловить событие БД о добавлении данных.


Название: Re: Обновление модели и представления
Отправлено: Larry от Январь 26, 2011, 13:50
я с базой работаю через QSqlTableModel...т.е. мне надо подключить сигнал отправленный базой на слот где происходит обновление? А reset() надо переопределить?


Название: Re: Обновление модели и представления
Отправлено: UVV от Январь 26, 2011, 14:33
Тут BRE правильно сказал, если есть возможность нужно сделать добавление данных в модель при помощи beginInsertRows()/endInsertRows() (Переопределять их не нужно, их нужно использовать внутри модели). Другой вопрос, если у тебя уже есть QSqlTableModel, то зачем ты сделал ещё одну модель?
Насчёт reset'a, переопределять его не надо. Сделай метод в своей модели, который будет вызывать reset.


Название: Re: Обновление модели и представления
Отправлено: Larry от Январь 26, 2011, 15:00
я использую QSqlTableModel для доступа к базе и извлечении данных(мне так удобнее)...Добавление данных в базу произвожу не через модель, а через отдельную форму(диалоговое окно)...определил метод и вызвал там reset(), это ни к чему не привело....что можно еще сделать?


Название: Re: Обновление модели и представления
Отправлено: Larry от Январь 26, 2011, 18:20
ни у кого нет никаких идей? Уже все перепробовал, но пока не нашел способ как это сделать >:(


Название: Re: Обновление модели и представления
Отправлено: twp от Январь 26, 2011, 18:25
Ну так понятно что reset не поможет, новые данные попадают напрямую в базу минуя модель. Нужно опять произвести выборку данных из базы, что не есть гуд, В общем сама схема работы неправильна, а это уже все костыли


Название: Re: Обновление модели и представления
Отправлено: Larry от Январь 26, 2011, 18:27
знаю что не правильно, но работает...я при занесении новых данных удаляю модель, а затем снова ее создаю и подсоединяю к вьюхе...работает....а по другому наверное и нельзя?!!


Название: Re: Обновление модели и представления
Отправлено: kolob от Сентябрь 28, 2012, 22:59
Цитировать
а по другому наверное и нельзя?!!
Так ни кто и не ответил на этот вопрос? Ни кто походу не делает обновление или очистку модели.
Мне вот тоже приходится каждый раз модель заново создавать после добавления, редактирования и удаления.
Хотелось бы узнать хоть какое нибудь решение. ???


Название: Re: Обновление модели и представления
Отправлено: kambala от Сентябрь 28, 2012, 23:10
я делаю полное обновление табличной модели (таблица 10х10, не БД) так:
Код
C++ (Qt)
void ItemStorageTableModel::setItems(const ItemsList &newItems)
{
   beginResetModel();
 
   _itemsHash.clear();
   foreach (ItemInfo *item, newItems)
       _itemsHash[qMakePair(item->row, item->column)] = item;
 
   endResetModel();
}


Название: Re: Обновление модели и представления
Отправлено: andrew.k от Сентябрь 28, 2012, 23:36
Я делал так. В БД поставил триггер на добавление/обновление/удаление данных в нужную таблицу.
Этот триггер отправлял нотифай. В модели его ловил и обрабатывал.
А удалять модель потом создавать заново и все коннектить по новой это капец.
Получается, что после каждого изменения в таблице, ты ее полностью заново загружаешь в модель?
А если там будут сотни тысяч строк?


Название: Re: Обновление модели и представления
Отправлено: trot от Сентябрь 29, 2012, 07:34
Цитировать
Этот триггер отправлял нотифай. В модели его ловил и обрабатывал.

А можно поподробней. Как отправляется нотифай и как его ловить в модели.


Название: Re: Обновление модели и представления
Отправлено: andrew.k от Сентябрь 29, 2012, 11:30
Цитировать
Этот триггер отправлял нотифай. В модели его ловил и обрабатывал.

А можно поподробней. Как отправляется нотифай и как его ловить в модели.
Понятно, что это постгрес, как отправлять в других СУБД не знаю
NOTIFY (http://www.postgresql.org/docs/9.0/static/sql-notify.html)
Подписываемся на нотифай:
subscribeToNotification (http://doc.qt.digia.com/4.7-snapshot/qsqldriver.html#subscribeToNotification)
Сигнал:
Код
C++ (Qt)
void notification ( const QString & name )