我有一个QTreeView和QItemDelegate。而且QTreeView有许多项目。
目标是:
如果我选择其中一个项目,那么不仅选择的项目,而且一些其他(在我的其他条件之后)项目也必须重新绘制(例如,其他颜色)。
问题是:
如果我在QTreeView中选择一个项,那么所选的项和其他项将在内部通过我的QItemDelegate重新绘制。到目前为止还不错。但是,在我选择其他窗口并再次选择此QTreeView之前,这些其他项的更改是不可见的。
所以..。我测试了以下功能..
重新油漆()、更新()等.
但它不会有任何改变。
只有当我选择任何其他窗口并再次选择QTreeView小部件时,我才能看到更改。
如何刷新QTreeView并通过QItemDelegate使更改可见?
发布于 2015-05-19 18:19:43
我在我的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()。
https://stackoverflow.com/questions/30329656
复制相似问题