我有一个QtTreeView
和一个来自Foo
的{{1}}课程。
在QAbstractItemModel
中,我根据某些内部数据的状态为树的每个元素设置Foo::data
。
当我收到更新内部数据的信号时,我想相应地更新每个项目的背景,但我似乎无法可靠地让Qt调用我的Qt::BackgroundRole
方法。
我试过调用Foo::data
和update()
(在视图上),但无济于事。调用repaint()
有效,但我失去了树的所有状态(例如扩展元素等)。在每个元素上调用reset()
也有效,但代码有点尴尬,因为我必须显式重建显示的数据树,这是不好的。
如何强制Qt在我的模型上调用setData()
?
答案 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;
}
(我不确定在第一列上总是有父母是否很重要......)