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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как увидеть изменения в модели если вьюха "не в фокусе"?  (Прочитано 4147 раз)
VAP
Гость
« : Апрель 03, 2010, 16:40 »

Привет всем!
Столкнулся со следующей проблемой: после производимых изменений в модели(QAbstractListModel), setData(const QModelIndex &index, const QVariant &value, int role), вьюха(QListView) не показывает эти изменения до тех пор пока не поподает "в фокус".
Для "обхода" этой проблемы, приходится выставлять вью в принудительный фокус при помощи setFocus(); Но как только пришлось производить изменения с большим количеством данных(много итемов с чекбоксами, которые нужно "отмечать"), то такой метод становится не совсем хорош из-за уже заметной инерционности. Может кто-то подсказать, как обойти подобную проблему?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Апрель 03, 2010, 16:48 »

Модель твоя? Нужные сигналы о изменении эмитишь?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
VAP
Гость
« Ответ #2 : Апрель 03, 2010, 16:59 »

 Из кода модели:
Код:
bool ConfigModel::setData(const QModelIndex &index,
                                    const QVariant &value, int role)
{
    if (!index.isValid())
        return false;
   
    if (role == Qt::CheckStateRole) {
        int row = index.row();
        if (value == Qt::Checked) {
            checkedRows.insert(row);
        } else {
            checkedRows.remove(row);
            emit dataChanged(index, index);
        }
        return true;
    }
    return false;
}
..............
void ConfigModel::setSelectAllState(int state)
{   
    for (int i = 0; i < rowCount(); ++i)
         setData(index(i, 0), state, Qt::CheckStateRole);
}


Для изменения вызываю сигнал-слот:
Код:
connect(setCheckBox, SIGNAL(stateChanged(int)), 
                    configModel, SLOT(setSelectAllState(int)));
Записан
Kolobok
Гость
« Ответ #3 : Апрель 03, 2010, 17:36 »

Код:
if (value == Qt::Checked) {
            checkedRows.insert(row);
            // ??? где сигнал ???
        } else {
            checkedRows.remove(row);
            emit dataChanged(index, index);
        }
Записан
VAP
Гость
« Ответ #4 : Апрель 03, 2010, 18:05 »

Какай еще там должен быть сигнал???
Все изменения состояния я пишу в QSet<int> checkedRows;A отображаю в:
Код:
QVariant ConfigModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();
   
    if (index.row() < 0 || index.row() >= stringList.size())
        return QVariant();
     
    switch (role) {
    case Qt::DisplayRole:
         return stringList.at(index.row());
    case Qt::CheckStateRole:
         if (checkedRows.contains(index.row()))
             return Qt::Checked;
         else
             return Qt::Unchecked;
    }
     return QVariant();
}
Записан
Kolobok
Гость
« Ответ #5 : Апрель 03, 2010, 18:17 »

В setData() ты высылаешь сигнал только если новое значение не равно Qt::Checked. Попробуй так

Код:
bool ConfigModel::setData(const QModelIndex &index,
                                    const QVariant &value, int role)
{
    if (!index.isValid())
        return false;
   
    if (role == Qt::CheckStateRole) {
        int row = index.row();
        if (value == Qt::Checked) {
            checkedRows.insert(row);
        } else {
            checkedRows.remove(row);           
        }
        emit dataChanged(index, index);
        return true;
    }
    return false;
}
Записан
VAP
Гость
« Ответ #6 : Апрель 03, 2010, 18:41 »

Спасибо Kolobok, помогло. Вопрос снят.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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