我正在通过单击ui上的按钮更改QListWidgetItem标题(QListWidgetItem文本),在此下我也调用repaint()&update(),但是标题不会更改(刷新),直到我们点击QlistWidget区域。请帮助我。提前致谢
在源头我发现了这个:
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可以提高性能,但它是可选的)。
这似乎与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
使用静态函数QCoreApplication::processEvents()
强制重绘。
可能会发出辱骂声,但是会给列表小部件焦点,这会强制重绘。无需调用repaint()或update()即可工作。
QWidget::setFocus()