QTreeView,QItemDelegate&刷新其他项目?

时间:2015-05-19 15:18:04

标签: c++ windows qt

我有一个QTreeViewQItemDelegateQTreeView有许多项目。

目标:

如果我选择其中一个项目,那么不仅必须重新绘制所选项目,还必须重新绘制其他项目(在我的其他条件之后)(例如,其他颜色)。

问题:

如果我在QTreeView中选择了一个项目,则所选项目和其他项目将通过我的QItemDelegate在内部重新绘制。到目前为止还不错。 但是,在我选择其他窗口并再次选择此QTreeView之前,这些其他项目的更改是不可见的。

所以..我测试了以下功能..

  

repaint(),update()等...

但它没有任何改变。

只有当我选择任何其他窗口并再次选择QTreeView窗口小部件时,我才能看到更改..

如何刷新QTreeView并按QItemDelegate显示更改?

1 个答案:

答案 0 :(得分:0)

我在QTreeWidget子类中的方式是:

void MyTreeWidgetSubclass :: ForceUpdateItem(QTreeWidgetItem * li)
{
   int lastIndex = columnCount()-1;
   QRect firstColCellRect = visualRect(indexFromItem(li, _headerView->logicalIndex(0)));
   QRect lastColCellRect = visualRect(indexFromItem(li, _headerView->logicalIndex(lastIndex))));
   viewport()->update(firstColCellRect | lastColCellRect);
}

显然如果你直接使用QTreeView类而不是QTreeWidget子类,你需要稍微修改一下,但原理是一样的:QTreeView类仍然有visualRect()方法给你给定QModelIndex的屏幕位置,因此您可以使用它来计算表示要更新的索引或索引的可视位置的QRect,然后使用该QRect作为参数调用viewport() - > update()