Russian Qt Forum

Qt => Общие вопросы => Тема начата: itan от Август 11, 2006, 10:04



Название: реакция на изменение элементов в модели
Отправлено: 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);
}


А потом в виджите присоеденить этот сигнал к слоту, который будет обновлять текущие индексы нужных вьюх.