在我的应用程序中,我有一个带有自定义小部件项目的 QListWidget,其中包含一个进度条,由 QListWidget::setWidget() 设置。我被迫使用 QListWidget 而不是 QListView 和委托,因为视图/委托解决方案不会像通常那样为项目小部件中的进度条设置动画。
我的问题是滚动 QListWidget 时,自定义小部件没有跟随。它们似乎只是简单地“粘”在背景上。只有在手动调整周围小部件的大小时,QListWidget 才会正确重新排列子小部件。
这是我向 QListWidget 添加小部件的方法:
QListWidgetItem* widgetItem = new QListWidgetItem("");
DownloadItemForm* dlItemForm = new DownloadItemForm(el);
widgetItem->setSizeHint(dlItemForm->size());
ui->listWidget->addItem(widgetItem);
ui->listWidget->setItemWidget(widgetItem, dlItemForm);
widgetItems.insert(el, widgetItem);
我在这里错过了什么吗?似乎其他人也有问题(最后一条评论是我的):
https://bugreports.qt-project.org/browse/QTBUG-27043
有谁知道解决方法,还是我只是在这里遗漏了什么?
编辑:
只是为了进一步澄清:我使用的是 Qt 4.8.4。虽然我希望这个问题会在 5.x 中得到解决,但它在 5.0.1 中仍然存在 在 Mac OS 上,进度条是动画的:即使没有进度更新,进度条中也有一个缓慢流动的动画。使用基于视图的小部件和项目委托时,此动画不会运行。在 Mac 上运行 Torrent Qt 示例将支持此声明。进度条动画在使用 QListWidget 时起作用,注入包含带有进度条的表单小部件的小部件项目。
查看 Qt 4.8.4 源代码,QListWidget::setItemWidget() 看起来像这样:
void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget)
{
Q_D(QListWidget);
QModelIndex index = d->listModel()->index(item);
QAbstractItemView::setIndexWidget(index, widget);
}
这告诉我问题可能出在 QAbstractItemView 中。我想我将不得不跳入其中并尝试从那里解决问题,并希望创建一个补丁,除非有人提出启示。