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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: реакция на изменение элементов в модели  (Прочитано 2730 раз)
itan
Гость
« : Август 11, 2006, 10:04 »

Есть такая задача:
предположим существует модель порожденная от QAbstractItemModel и существует несколько вьюх (пусть будет QComboBox) использующих эту модель. В некоторый момент времени наступает событие, которое меняет порядок элементов в модели. Вопрос в следующем - как правильно всем вьюхам прореагировать на это изменение?

Привожу словестный пример для разъяснения:
пусть модель предоставляет для вывода 3 строки:
"1 строка"
"2 строка"
"3 строка"

соответственно пусть эти данные отображаются в 2-х комбобоксах:
у 1-го текущий элемент "1 строка"
у 2-го текущий элемент "2 строка"

потом в модели происходит смена порядка элементов:
что-то вроде:
Код:
QList<QString>	m_items;
...

void CModel::moveItem(int idxFrom, int idxTo)
{
         m_items.move(idxFrom, idxTo);
dataChanged(index(idxFrom, 0), index(idxFrom, 0));
dataChanged(index(idxTo, 0), index(idxTo, 0));
}


Пусть поменялись 1 и 2 строки местами т.е. получаем:
"2 строка"
"1 строка"
"3 строка"

И что же мы видем в комбобоксах:
у 1-го текущий элемент "2 строка"
у 2-го текущий элемент "1 строка"

т.е. данные в них обновились, а текущие индексы не поменялись!
Может есть какой-нибудь стандартный механизм отслеживания таких изменений?
Никто не сталкивался?

добавлено спустя 1 час 6 минут:

 В принципе проблема решается легко - т.к. стандартных механизмов не существует, то достаточно определить свой новый сигнал в модели:
Код:
...
signals:
void itemMoved(int idxFrom, int idxTo);
...


Код:
void CModel::moveItem(int idxFrom, int idxTo) 
{
   m_items.move(idxFrom, idxTo);
   dataChanged(index(idxFrom, 0), index(idxFrom, 0));
   dataChanged(index(idxTo, 0), index(idxTo, 0));

   emit itemMoved(idxFrom, idxTo);
}


А потом в виджите присоеденить этот сигнал к слоту, который будет обновлять текущие индексы нужных вьюх.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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