![]() |
|
|
![]()
|
|
| NumLock |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 30.7.2006 Где: Иркутск Репутация: нет Всего: нет |
Есть модель, которую нужно фильтровать. Она грузится во view, а фильтрация осуществляется перезагрузкой модели из базы данных. После перезагрузки модель испускает сигнал:
А во view этот сигнал модели коннектится к слоту dataChanged();
А в слоте говорю update(); Во-первых, слот не вызываеся после испускания сигнала. Во-вторых, после обновления модели (фильтрации) во view отображается меньше элементов, чем было (что логичто после фильтрации), однако оставшиеся "пустые" места никуда не деваются. Они просто рисуются ниже основной информации, т.е. количество строчек во view остается прежним. И если дважды кликнуть на пустое место, отобразится элемент редактрирования в котором будет отображено "старое" значение, которое было там до фильтрации. Что я делаю не так? Как правильно сообщить отображению об изменении в модели? |
||||
|
|||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 5 Всего: 39 |
NumLock,
Не нужно самому ничего коннектить. А нужно: 1. При обновлении модели установить в нее новое актуальное число столбцов: removeRows - если данных стало меньше и insertRows, если больше. 2. Из модели сделать emit this->dataChanged, модель сама скажет своему view, что нужно обновить. ЗЫ. В API мог чуть-чуть напутать, сверьтесь с ассистентом. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| NumLock |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 30.7.2006 Где: Иркутск Репутация: нет Всего: нет |
Насколько я понимаю, removeRows() применяется, когда надо сказать модели удалить некоторые строки начиная с такой-то. Я не могу знать какие строки у меня удаляются, а какие нет, т.к. происходит фильтрация строк в базе данных по запросу введенному пользователем. Коннектить самостоятельно я начал от безысходности: так как просто испускание сигнала не приводит к вызову слота.
Сейчас все выглядит так: при фильтрации происходит вызов функции loadDirectory(QString, QString); (это моя функция), она грузит из базы новые данные и говорит emit dataChanged(...); в view слот dataChanged() выглядит так:
А описание выглядит так:
Почему не вызывается слот я понять не могу. Это сообщение отредактировал(а) NumLock - 23.8.2010, 09:42 |
||||
|
|||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 5 Всего: 39 |
NumLock, удаляйте с конца (${сколько было} - ${сколько стало}) строк. И уберите вообще свой слот dataChanged из view - он не нужен.
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| NumLock |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 30.7.2006 Где: Иркутск Репутация: нет Всего: нет |
Спасибо за объяснение работы функций removeRows и insertRows, но слот dataChanged все-таки нужен: там находится функция которая говорит всем наследникам root-а в моем tree view чтобы они были firstColumnSpanned().
|
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |