Есть такая задача:
предположим существует модель порожденная от 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);
}
А потом в виджите присоеденить этот сигнал к слоту, который будет обновлять текущие индексы нужных вьюх.