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

时间:2011-08-22 08:03:29

标签: qt qt4

我正在通过单击ui上的按钮来更改QListWidgetItem标题(QListWidgetItem文本),在此我也调用了repaint()&更新(),但标题不会改变(刷新),直到我们点击QlistWidget区域。请帮助我。提前致谢

4 个答案:

答案 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是否已更改。

如果您要在“视图”中进行更改,则可以强制进行更新...
但如果有多个视图,则不会更改其他视图,只会更改当前视图。

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

dataChangedlayoutAboutToBeChanged()来结束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()