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

问题描述 投票:1回答:4

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

qt qt4
4个回答
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
投票

这似乎与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

0
投票

使用静态函数QCoreApplication::processEvents()强制重绘。


0
投票

可能会发出辱骂声,但是会给列表小部件焦点,这会强制重绘。无需调用repaint()或update()即可工作。

QWidget::setFocus()
© www.soinside.com 2019 - 2024. All rights reserved.