0

私のアプリケーションでは、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.

4

3 に答える 3

3

listWidget のスクロール バーの valueChanged(int) シグナルを listWidget の updateEditorGeometries() スロットに接続するだけです。

connect(_listWidget->verticalScrollBar(),
        SIGNAL(valueChanged(int)),_listWidget,
        SLOT(updateEditorGeometries()));
connect(_listWidget->horizontalScrollBar(),
        SIGNAL(valueChanged(int)),_listWidget,
        SLOT(updateEditorGeometries()));
于 2014-03-31T07:32:35.647 に答える
1

Qt コマーシャル サポートから提供されたこのパッチを適用しました。これにより、Qt 4.8.5 での Mac のスクロールの問題が解決されました。

--- /Users/irfanomair/dev/qt-src-carbon-4.8.0/src/gui/kernel/qwidget_mac.mm 2011-12-15 10:38:21.000000000 -0800
+++ kernel/qwidget_mac.mm   2012-09-18 17:17:03.000000000 -0700
@@ -1,22 +1,41 @@

@@ -4684,15 +4703,14 @@
     }

     // Scroll the whole widget if qscrollRect is not valid:
-    QRect validScrollRect = qscrollRect.isValid() ? qscrollRect : q->rect();
-    validScrollRect &= clipRect();
+    QRect validScrollRect = qscrollRect.isValid() ? qscrollRect : QRect(0, 0, q->width(), q->height());

     // If q is overlapped by other widgets, we cannot just blit pixels since
     // this will move overlapping widgets as well. In case we just update:
     const bool overlapped = isOverlapped(validScrollRect.translated(data.crect.topLeft()));
     const bool accelerateScroll = accelEnv && isOpaque && !overlapped;
     const bool isAlien = (q->internalWinId() == 0);
-    const QPoint scrollDelta(dx, dy);
+

     // If qscrollRect is valid, we are _not_ supposed to scroll q's children (as documented).
     // But we do scroll children (and the whole of q) if qscrollRect is invalid. This case is
@@ -4714,7 +4732,6 @@
         }else {
             update_sys(qscrollRect);
         }
-        return;
     }

 #ifdef QT_MAC_USE_COCOA
@@ -4731,6 +4748,7 @@
     // moved when the parent is scrolled. All directly or indirectly moved
     // children will receive a move event before the function call returns.
     QWidgetList movedChildren;
+    const QPoint scrollDelta(dx, dy);
     if (scrollChildren) {
         QObjectList children = q->children();
于 2013-03-15T15:08:13.547 に答える