2011-12-07 4 views
0

GUIでバックエンドから毎秒40ラインの平均速度で多くのログ行を表示するには、QListWidgetより優れていますか?QListWidget :: addItem()は、1秒間に40回コールするとちらつきが発生する

QListWidgetは、多くの文字列がすでにListWidgetに配置されているときに、長い間ウィジェットの代わりに点滅し、白いボックスを表示します。

ユーザーにログ行を動的に表示するためのより良いソリューションはありますか?

更新:
変更されたアーキテクチャ。 新しいQStringsをstd :: dequeに追加する< QString *>。 QTimerを使用して、その文字列を1/10秒ごとにQPlainTextEditに追加し、両端キューから削除します。 boost :: mutexはstd :: dequeを保護するために使われます(ログ行は別のスレッドから来ています)。

私自身のQListViewを実装し、文字列を事前に割り当てられたメモリの大きな塊に保持するのは良いことです。

答えて

2

QListWidgetの機能が必要ですか?ログラインを表示したいだけの場合は、単純な読み取り専用QPlainTextEditが適切だろうと思います。

+0

私はときに私QPlainTextEditは、メモリ再割り当ての多くを引き起こす可能性が怖いです行を追加します。 QListWidgetは、行を分割線の連鎖として格納するために魅力的です。 – pavelkolodin

+3

@pavelkolodin、QListWidgetを使用すると、QtのMVCフレームワークのオーバーヘッドが発生するため、プレーンテキストを使用する場合よりも多くのメモリを消費します。あなたがナットを割るためにスレッジハンマーを使用しようとしているようです。とにかく毎秒40本のラインでは、ちらつきを避けるためにビデオゲームのような最適化が必要です。多分あなたのロガーを実装するためにOpenGLやDirect 3Dを試してみてください:) –

+0

@Laurent、ありがとう。 QPlainTextEditははるかに高速です。 – pavelkolodin

1

QListViewを使用し、QAbstractItemModelの実装を所有している可能性があります。そして、あなたが望むようにあなたの行を保存し、大きなグループに新しい行を追加することができます(約1秒ごとにOKです)。その後、すべての行を追加する際にビューがリフレッシュされるのではなく、グループ単位でのみ表示されるため、パフォーマンスが大幅に向上します。

0

リフレッシュレートを設定し、すべてのギャザーアイテムを一度に追加することをお勧めします。あなたが追加する行ごとにウィジェットの塗り直しを避けます。

かいつまん: のリフレッシュレートとQTimer(〜1-3秒は十分だろう)、QListWidget ::代わりQListWidgetのaddItems ::のaddItem

+0

私は既にリフレッシュのために100ミリ秒に設定されたQTimerを使用しています( - ; QListWidgetをQPlainTextEditに変更しました。 – pavelkolodin