Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не обновляется view при обновлении модели, модель испускает сигнал, а view не ловит 
:(
    Опции темы
NumLock
Дата 23.8.2010, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 30.7.2006
Где: Иркутск

Репутация: нет
Всего: нет



Есть модель, которую нужно фильтровать. Она грузится во view, а фильтрация осуществляется перезагрузкой модели из базы данных. После перезагрузки модель испускает сигнал:
Код

emit dataChanged(QModelIndex(), index(rowCount(QModelIndex()), 0, QModelIndex()));

А во view этот сигнал модели коннектится к слоту dataChanged();
Код

QObject::connect(this->model(), SIGNAL(dataChanged(QModelIndex, QModelIndex)),
                 this, SLOT(dataChanged(QModelIndex, QModelIndex)));

А в слоте говорю update(); Во-первых, слот не вызываеся после испускания сигнала.
Во-вторых, после обновления модели (фильтрации) во view отображается меньше элементов, чем было (что логичто после фильтрации), однако оставшиеся "пустые" места никуда не деваются. Они просто рисуются ниже основной информации, т.е. количество строчек во view остается прежним. И если дважды кликнуть на пустое место, отобразится элемент редактрирования в котором будет отображено "старое" значение, которое было там до фильтрации.

Что я делаю не так? Как правильно сообщить отображению об изменении в модели?
PM MAIL ICQ Skype Jabber   Вверх
djamshud
Дата 23.8.2010, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 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
PM   Вверх
NumLock
Дата 23.8.2010, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 30.7.2006
Где: Иркутск

Репутация: нет
Всего: нет



Насколько я понимаю, removeRows() применяется, когда надо сказать модели удалить некоторые строки начиная с такой-то. Я не могу знать какие строки у меня удаляются, а какие нет, т.к. происходит фильтрация строк в базе данных по запросу введенному пользователем. Коннектить самостоятельно я начал от безысходности: так как просто испускание сигнала не приводит к вызову слота.

Сейчас все выглядит так: при фильтрации происходит вызов функции loadDirectory(QString, QString); (это моя функция), она грузит из базы новые данные и говорит emit dataChanged(...); в view слот dataChanged() выглядит так:
Код

void
DirectoryTreeView::dataChanged(const QModelIndex& from, const QModelIndex& to)
{
    qDebug() << "dataChanged();";
    update(from);
    travelOver(from);
}

А описание выглядит так:
Код

protected slots:
    void dataChanged(const QModelIndex& from, const QModelIndex& to);

Почему не вызывается слот я понять не могу.

Это сообщение отредактировал(а) NumLock - 23.8.2010, 09:42
PM MAIL ICQ Skype Jabber   Вверх
djamshud
Дата 23.8.2010, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 5
Всего: 39



NumLock, удаляйте с конца (${сколько было} - ${сколько стало}) строк. И уберите вообще свой слот dataChanged из view - он не нужен.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
NumLock
Дата 23.8.2010, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 30.7.2006
Где: Иркутск

Репутация: нет
Всего: нет



Спасибо за объяснение работы функций removeRows и insertRows, но слот dataChanged все-таки нужен: там находится функция которая говорит всем наследникам root-а в моем tree view чтобы они были firstColumnSpanned().
PM MAIL ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0417 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.