Qt 更改QListZWidget项标题后如何重新绘制QListWidget

Qt 更改QListZWidget项标题后如何重新绘制QListWidget,qt,qt4,Qt,Qt4,我通过单击ui上的一个按钮来更改QListWidgetItem标题(QListWidgetItem文本),并在该按钮下调用repaint()&update(),但标题在单击QlistWidget区域之前不会更改(刷新)。请帮帮我。提前感谢使用静态函数强制重新绘制。听起来可能有点滥用,但如果给列表小部件焦点,这将强制重新绘制。无需调用repaint()或update() 在源代码中,我发现: void QAbstractItemView::update(const QModelIndex &

我通过单击ui上的一个按钮来更改QListWidgetItem标题(QListWidgetItem文本),并在该按钮下调用repaint()&update(),但标题在单击QlistWidget区域之前不会更改(刷新)。请帮帮我。提前感谢

使用静态函数强制重新绘制。

听起来可能有点滥用,但如果给列表小部件焦点,这将强制重新绘制。无需调用repaint()或update()


在源代码中,我发现:

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);
    }
}
因此,如果没有有效的索引,什么也不会发生

然而,似乎有效的(至少对我而言)是:


这也是有意义的,因为这是由QT调用的(使用rect可以提高性能,但它是可选的)。

这似乎与QT中长期存在的错误有关,(找不到数字),其中的
数据更改
信号不会触发重新绘制,如果图标中唯一发生更改的内容。它不会检查
Qt::DecorationRole
以查看它是否已更改

如果您正在从“视图”进行更改,则可以强制更新…
但是如果有多个视图,它不会更改其他视图,只更改当前视图

我的建议确实有效,而且比模型重置成本低得多,并且将更新所有视图

使用
layoutboutbechanged()
layoutChanged()
dataChanged
信号调用包装如下:

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

感谢您的回复,但我的问题仍然是一样的,实际上我正在使用我自己的委托进行QListWidget。有没有别的办法没有密码很难说。在调用ProcessEvents之前,您可以尝试调用
QListWidget::viewport()->update()
。我的良心不允许我升级这个丑陋的黑客程序,但我想说声谢谢:它很管用!我将QListView与自定义的deleagte和
viewport()->update()一起使用为我工作。谢谢
viewport()->update();
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