我正在通过单击ui上的按钮来更改QListWidgetItem标题(QListWidgetItem文本),在此我也调用了repaint()&更新(),但标题不会改变(刷新),直到我们点击QlistWidget区域。请帮助我。提前致谢
答案 0 :(得分:3)
在源头我发现了这个:
void QAbstractItemView::update(const QModelIndex &index)
{
Q_D(QAbstractItemView);
if (index.isValid()) {
const QRect rect = visualRect(index);
//this test is important for peformance reason
//For example in dataChanged we simply update all the cells without checking
//it can be a major bottleneck to update rects that aren't even part of the viewport
if (d->viewport->rect().intersects(rect))
d->viewport->update(rect);
}
}
因此,如果没有有效的索引,就不会发生任何事情。
然而,似乎有用的(至少对我而言)是:
viewport()->update();
这也是有意义的,因为这是由QT调用的(使用rect可以提高性能,但它是可选的)。
答案 1 :(得分:1)
这似乎与Qt中长期存在的错误有关(无法找到数字),如果图标中仅发生了更改,则dataChanged
信号不会触发重新绘制。它不会检查Qt::DecorationRole
是否已更改。
如果您要在“视图”中进行更改,则可以强制进行更新...
但如果有多个视图,则不会更改其他视图,只会更改当前视图。
我的建议有效,并且比重置模型的成本低得多,并且会更新所有视图。
以dataChanged
和layoutAboutToBeChanged()
来结束layoutChanged()
信号呼叫,如下所示:
layoutAboutToBeChanged();
"call functionality that change the icon to be shown"
emit dataChanged( index, index ); // does nothing
layoutChanged(); // forces a repaint of visible data on all open views
答案 2 :(得分:0)
使用静态函数QCoreApplication::processEvents()
强制重新绘制。
答案 3 :(得分:0)
可能声音滥用,但是给列表小部件焦点,这将强制重绘。无需调用repaint()或update()即可正常工作。
QWidget::setFocus()