2017-02-02 9 views
0

私の問題は、シンプルで迷惑なユーザーエクスペリエンスに損害を与えます。私はQGraphicsSceneにカスタムQGraphicsItemの膨大な金額(10万)を表示しようとしています。私もQGraphicsLayoutが必要ですが、私の理解によれば、レイアウトはQGraphicsWidgetに設定してから、そのウィジェットをシーンに追加する必要があるため、単にシーンにレイアウトを置くことができませんでした。レスポンシブQGraphicsWidget

は今、私はまたはは、前述のQGraphicsWidgetを再描画無効になることはありませことができるので、そこに空が、座っているシーンを表示する多数のアイテムをロードし、それらを準備する必要がある場合。最後にのみシーンに追加することができます。そうしないと、後で変更されたものは表示されません。

目標:はシーンにレイアウト管理のいくつかの種類を追加 - { - >レイアウトに項目を追加 - アイテムを準備>表示 - >項目を準備 - >}>繰り返し...

しかし、どのような私は:{アイテムを準備する - >別のアイテムを準備する - >}繰り返す - >レイアウトにすべてを追加する - >シーンのレイアウト管理を設定する - >表示

質問:どのような方法がありますかシーンに反応するレイアウト/コンテナを作成します。新しいコンテナは、新しい子が追加された後に再描画されます。 Qtのマニュアルから

答えて

0

シーン変化、(例えば、アイテムが移動またはが変換されたとき) QGraphicsSceneが変化()信号を発します。

addItem()とremoveItem()については言及していません。うまくいけば、これらもカバーされています。

ので、あなたは、次の適用可能性がある場合:

シグナルハンドラかもしれない「キャッチ」の変化を、シーンの(例えば、無効()で)再描画を要求します。 (Un-)幸いにも、これは直ちにシーンを親ビューで再描画するのではなく、再描画イベントをキューに入れます。したがって、実際の再描画は、イベントループが再びパスされるまで行われません。

(イベントループははQApplicationの一部であるあなたは、このようなコールスタック何かに見つけるユーザーインターフェースによって開始コマンド内のアプリケーションを停止した場合:。

Qt5Cored.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags) 
Qt5Cored.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags) 
Qt5Cored.dll!QCoreApplication::exec() 

あなたはQApplication :: processEvents()を呼び出すことでこれを強制することができます。 AFAIKでは、イベントループがネストされていても、(終了していない再帰が形成されていない限り)これが準備されているので、通常は問題ありません。

しかし、あまりにも多くの再塗りつぶしが大量のアプリケーションを遅くする可能性があるので、これはおそらく微調整が必​​要です。

+0

シグナルスロットのチップをありがとう、私はそれを利用します。私の問題では助けにはなりませんでしたが – czimbortibor

0

私のエラーを見つけるために管理します。私がQGraphicsWidgetのために作成したカスタムレイアウトでした。docとして

は、レイアウトの設定に言う:

現在のレイアウトまたはそのサブレイアウトのすべてによって管理されているすべてのウィジェットは、自動的にこの項目にリペアレントされています。レイアウトは無効化され、子ウィジェットのジオメトリはこのアイテムのgeometry()およびcontentsMargins()に従って調整されます。レイアウトによって明示的に管理されていない子供は、このウィジェットに割り当てられた後、レイアウトの影響を受けません。

レイアウトがウィジェットに設定された後、ウィジェットに追加された新しいアイテムはそのウィジェットに親を持たないため、影響を受けずに表示されませんでした。

レイアウトに挿入されたすべてのアイテムにQGraphicsLayout::addChildLayoutItem(QGraphicsLayoutItem* newItem)linkを呼び出すと、私の問題が解決しました。

関連する問題