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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Обновление модели и представления  (Прочитано 9990 раз)
Larry
Гость
« : Январь 26, 2011, 12:29 »

Добрый день, форумчане!У меня есть модель дерева унаследованная от qAbstractItemModel и представление QTreeView. Модель заполняется данными из бд. Все работает нормально, только при внесении новых данных в базу приходиться перезапускать программу, чтобы увидеть новые данные. Как можно обновить модель, чтобы данные можно было сразу видеть?
Записан
UVV
Гость
« Ответ #1 : Январь 26, 2011, 13:04 »

QAbstractItemModel::reset()
Записан
Larry
Гость
« Ответ #2 : Январь 26, 2011, 13:06 »

извините за тупой вопрос Смеющийся, а ее тоже переопределить надо?
Записан
BRE
Гость
« Ответ #3 : Январь 26, 2011, 13:08 »

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

Нужно разобраться с моделями и правильно добавлять данные.

Тут немного сложнее ему будет, вероятно.
В этом случае ему нужно ловить событие БД о добавлении данных.
Записан
Larry
Гость
« Ответ #5 : Январь 26, 2011, 13:50 »

я с базой работаю через QSqlTableModel...т.е. мне надо подключить сигнал отправленный базой на слот где происходит обновление? А reset() надо переопределить?
Записан
UVV
Гость
« Ответ #6 : Январь 26, 2011, 14:33 »

Тут BRE правильно сказал, если есть возможность нужно сделать добавление данных в модель при помощи beginInsertRows()/endInsertRows() (Переопределять их не нужно, их нужно использовать внутри модели). Другой вопрос, если у тебя уже есть QSqlTableModel, то зачем ты сделал ещё одну модель?
Насчёт reset'a, переопределять его не надо. Сделай метод в своей модели, который будет вызывать reset.
Записан
Larry
Гость
« Ответ #7 : Январь 26, 2011, 15:00 »

я использую QSqlTableModel для доступа к базе и извлечении данных(мне так удобнее)...Добавление данных в базу произвожу не через модель, а через отдельную форму(диалоговое окно)...определил метод и вызвал там reset(), это ни к чему не привело....что можно еще сделать?
Записан
Larry
Гость
« Ответ #8 : Январь 26, 2011, 18:20 »

ни у кого нет никаких идей? Уже все перепробовал, но пока не нашел способ как это сделать Злой
Записан
twp
Гость
« Ответ #9 : Январь 26, 2011, 18:25 »

Ну так понятно что reset не поможет, новые данные попадают напрямую в базу минуя модель. Нужно опять произвести выборку данных из базы, что не есть гуд, В общем сама схема работы неправильна, а это уже все костыли
Записан
Larry
Гость
« Ответ #10 : Январь 26, 2011, 18:27 »

знаю что не правильно, но работает...я при занесении новых данных удаляю модель, а затем снова ее создаю и подсоединяю к вьюхе...работает....а по другому наверное и нельзя?!!
Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #11 : Сентябрь 28, 2012, 22:59 »

Цитировать
а по другому наверное и нельзя?!!
Так ни кто и не ответил на этот вопрос? Ни кто походу не делает обновление или очистку модели.
Мне вот тоже приходится каждый раз модель заново создавать после добавления, редактирования и удаления.
Хотелось бы узнать хоть какое нибудь решение. Непонимающий
Записан

Qt 5.11.0, Win, MinGW
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #12 : Сентябрь 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();
}
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
andrew.k
Гость
« Ответ #13 : Сентябрь 28, 2012, 23:36 »

Я делал так. В БД поставил триггер на добавление/обновление/удаление данных в нужную таблицу.
Этот триггер отправлял нотифай. В модели его ловил и обрабатывал.
А удалять модель потом создавать заново и все коннектить по новой это капец.
Получается, что после каждого изменения в таблице, ты ее полностью заново загружаешь в модель?
А если там будут сотни тысяч строк?
Записан
trot
Гость
« Ответ #14 : Сентябрь 29, 2012, 07:34 »

Цитировать
Этот триггер отправлял нотифай. В модели его ловил и обрабатывал.

А можно поподробней. Как отправляется нотифай и как его ловить в модели.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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