Russian Qt Forum

Qt => Model-View (MV) => Тема начата: VAP от Апрель 03, 2010, 16:40



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


Название: Re: Как увидеть изменения в модели если вьюха "не в фокусе"?
Отправлено: Пантер от Апрель 03, 2010, 16:48
Модель твоя? Нужные сигналы о изменении эмитишь?


Название: Re: Как увидеть изменения в модели если вьюха "не в фокусе"?
Отправлено: VAP от Апрель 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)));


Название: Re: Как увидеть изменения в модели если вьюха "не в фокусе"?
Отправлено: Kolobok от Апрель 03, 2010, 17:36
Код:
if (value == Qt::Checked) {
            checkedRows.insert(row);
            // ??? где сигнал ???
        } else {
            checkedRows.remove(row);
            emit dataChanged(index, index);
        }


Название: Re: Как увидеть изменения в модели если вьюха "не в фокусе"?
Отправлено: VAP от Апрель 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();
}


Название: Re: Как увидеть изменения в модели если вьюха "не в фокусе"?
Отправлено: Kolobok от Апрель 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;
}


Название: Re: Как увидеть изменения в модели если вьюха "не в фокусе"?
Отправлено: VAP от Апрель 03, 2010, 18:41
Спасибо Kolobok, помогло. Вопрос снят.