如何强制Qt在我的模型上调用`data()`?

时间:2011-10-06 17:42:27

标签: qt4

我有一个QtTreeView和一个来自Foo的{​​{1}}课程。

QAbstractItemModel中,我根据某些内部数据的状态为树的每个元素设置Foo::data

当我收到更新内部数据的信号时,我想相应地更新每个项目的背景,但我似乎无法可靠地让Qt调用我的Qt::BackgroundRole方法。

我试过调用Foo::dataupdate()(在视图上),但无济于事。调用repaint()有效,但我失去了树的所有状态(例如扩展元素等)。在每个元素上调用reset()也有效,但代码有点尴尬,因为我必须显式重建显示的数据树,这是不好的。

如何强制Qt在我的模型上调用setData()

3 个答案:

答案 0 :(得分:5)

您需要通过发出dataChanged信号通知视图类您的模型已更改。

答案 1 :(得分:1)

当你开始修改数据然后endResetModel()时尝试使用beginResetModel(),但请记住,你的视图/模型在每次更改时都会有糟糕的表现,因为整个模型将被查询并再次绘制

答案 2 :(得分:1)

对于James Turner的正确回答,这里有一些未来的附加代码 参考。要表明所有数据都已更改,需要检索 第一项和最后一项的索引。

第一项是微不足道的:

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;
}

(我不确定在第一列上总是有父母是否很重要......)