私のアプリケーションでは、QListWidget::setWidget() によって設定されたプログレス バーを含むカスタム ウィジェット アイテムを含む QListWidget を使用しています。ビュー/デリゲート ソリューションはアイテム ウィジェットの進行状況バーを通常のようにアニメーション化しないため、QListView とデリゲートの代わりに QListWidget を使用することを余儀なくされました。
私の問題は、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);
}
which tells me that the problem probably lies within QAbstractItemView. I suppose I'll have to jump into it and try to fix the problem from there, and hopefully create a patch, unless someone comes up with a revelation.