Как я могу заставить Qt вызывать `data ()` для моей модели? - PullRequest
1 голос
/ 06 октября 2011

У меня есть QtTreeView и класс Foo, полученный из QAbstractItemModel, прикрепленный к нему.

В Foo::data Я установил Qt::BackgroundRole для каждого элемента дерева в соответствии со статусом некоторых внутренних данных.

Когда я получаю сигнал на обновление своих внутренних данных, я бы хотел соответствующим образом обновить фон каждого элемента, но я не могу заставить Qt надежно вызвать мой метод Foo::data.

Я пытался звонить update() и repaint() (на виду), но безрезультатно. Вызов reset() работает, но я теряю все состояние дерева (например, расширенные элементы и т. Д.). Вызов setData() для каждого элемента также работает, но код становится немного неловким, поскольку мне приходится явно перестраивать отображаемое дерево данных, что нехорошо.

Как заставить Qt вызвать data() на моей модели?

Ответы [ 3 ]

5 голосов
/ 06 октября 2011

Вы должны сообщить классу представления, что ваша модель изменилась, испуская сигнал dataChanged .

1 голос
/ 10 октября 2011

Далее к правильному ответу Джеймса Тернера, вот дополнительный код для дальнейшего использования.Чтобы сигнализировать, что все данные изменились, необходимо извлечь индексы первого и последнего элемента.

Первый элемент тривиален:

QModelIndex FooModel::firstIndex() const
{
    return index( 0, 0 );
}

Последний элемент также тривиалендля иерархии одного уровня:

QModelIndex FooModel::lastIndex() const
{
    QModelIndex lastTopLevelIndex = index( rowCount() - 1, 0 );
    return index( rowCount( lastTopLevelIndex ) - 1, kNumColumns, lastTopLevelIndex );
}

и немного более сложный в общем случае:

QModelIndex FooModel::lastIndex() const
{
    QModelIndex parent;
    QModelIndex candidate;
    QModelIndex lastIndex;
    int row = rowCount();

    while ( row > 0 )
    {
        parent = index( row - 1, 0, parent );
        candidate = index( row - 1, kNumColumns, parent );
        row = rowCount( parent );
    }

    return candidate;
}

(я не уверен, важно ли всегда иметь родителя напервый столбец или нет ...)

1 голос
/ 07 октября 2011

Попробуйте beginResetModel (), когда вы начнете изменять данные, а затем endResetModel (), но помните, что ваше представление / модель будет иметь низкую производительность при каждом изменении, потому что вся модель будет запрошена и покрашена снова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...