2012-05-05 5 views
1

バッチレイアウトモードでQListWidgetを使用すると、バッチサイズよりも多くの項目が追加されるたびに、古いリストから新しいリストに切り替えるときにリストウィジェットが短時間点滅します。つまり、リストウィジェットは項目を表示せず、スクロールバーのハンドルは一見ランダムなサイズに設定されます。バッチモードでQListWidgetを使用すると点滅する問題

あなたはこれまでにこれに遭遇しましたか?これは何とか解決できますか?私はQt 4.7.4を使用しています。おそらく私は隠しアイテムを使用していないと付け加えるべきです。

答えて

4

私はこの問題も抱えていて、Qtウィジェットのレンダリングで海を櫛通りに費やしました。最終的には、あなたのように、私はQListViewのバッチ処理に戻って問題を追跡しました。バッチ処理が有効になっていると、Qtは内部タイマーを起動して、基本となるスクロールビューの増分レイアウト調整を実行するようになります。これらのインクリメンタルレイアウトでは、スクロールバーが表示されていると、更新領域が正しく計算されません(大きすぎるため、スクロールウィジェット自身が占める領域は考慮されません)。その結果、不正な更新領域が発生し、ビューポートの更新が検出され、ListViewItemのいずれもレンダリングせずにクライアント領域全体をクリアする不都合な副作用があります。

一度バッチ処理が完了すると、最後のビューポート更新でレイアウトジオメトリ(スクロールバー付き)が正しく計算され、有効な更新領域が生成されます。リストの可視要素が次に再描画されます。

リスト内のアイテムの数が増えるほど(バッチサイズに対して)動作が悪くなります。たとえば、リストが500から50000個のアイテム、バッチサイズが50から増加する場合、トリガされる「不良再描画」イベントの数が比例して増加し、ビューが目に見えるほどちらつくようになります。 :(

これらの増分(失敗した)ビューポートの更新もあなたが記述スクロールバーのハンドル位置で見かけspazmodic行動を起こすように見える。

この問題の根は、このだったという「ハック」に関連する表示されます私はあなたがQListView :: doItemsLayoutを(上書き)とスクロールバーを適切に処理し、独自のバッチ処理を提供できると仮定しますが、個人的に私はあまりにも古いです

// showing the scroll bars will trigger a resize event, 
// so we set the state to expanding to avoid 
// triggering another layout 
QAbstractItemView::State oldState = state(); 
setState(ExpandingState); 

:ここでコメントしたよう QListView :: doItemsLayout()に追加他の誰かのおしゃぶりをきれいにすることを怠惰にしています。SinglePass eliに切り替える問題を完全に解明したシームレスなフリッカーフリーのレンダリングと期待していたスクロールバーの動作。わーい。

+1

この問題の根本原因を掘り下げてくれてありがとうございます。私は時間があり、あまりにも怠惰な気がしないときは、バグレポートを提出します:) –

+0

非常に良い!! – Ashish

関連する問題