我有一个QTreeView
和QItemDelegate
。
QTreeView
有许多项目。
目标:
如果我选择其中一个项目,那么不仅必须重新绘制所选项目,还必须重新绘制其他项目(在我的其他条件之后)(例如,其他颜色)。
问题:
如果我在QTreeView
中选择了一个项目,则所选项目和其他项目将通过我的QItemDelegate
在内部重新绘制。到目前为止还不错。
但是,在我选择其他窗口并再次选择此QTreeView
之前,这些其他项目的更改是不可见的。
所以..我测试了以下功能..
repaint(),update()等...
但它没有任何改变。
只有当我选择任何其他窗口并再次选择QTreeView
窗口小部件时,我才能看到更改..
如何刷新QTreeView
并按QItemDelegate
显示更改?
答案 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()