1

はじめに: VBoxlayout (「ScopeView」) を使用してコンテナー ウィジェットにカスタム QWidget (つまり、「ScopeWidget」) のリストを表示するアプリを作成しています。

すべての scopeWidget には、独自のデータ ソース クラス (「スコープ」) へのポインターがあります。これらのオブジェクトは論理的にグループに配置されます。つまり、1 つのグループ内のオブジェクト間でいくつかの共有パラメータ (「ScopeShared」) があります。これらのパラメーターは、scopeWidget に表示する必要があるデータを取得 (または準備) するときに必要です。

もう一歩: scopeWidget には 2 つのパラメータ セットが必要です。これらは「Scope」によって指定され、「ScopeGroup」によって指定されます。scopeWidget は、ユーザー アクションによって、グループ内の共有パラメーターの一部を変更できます。これにより、このグループ内の「Scope」によって保持された、以前に取得されたすべてのデータが無効になります。デフォルトでは、「スコープ」に表示可能なデータはありません。データは必要に応じて取得されます – paintEvent が発生したとき (これが問題の原因です)。「スコープ」で表示可能なデータを取得するには、この特定のグループのすべての「スコープ」を処理する必要があります (グループ内のすべての「スコープ」で使用可能なデータが生成されます)。

仕組み: ユーザーは、scopeWidgets の 1 つにグループ内の共有データを強制的に変更させます。これらの変更を行った後、このグループの「Scope」によって保持されるすべてのデータは無効になるため、変更イベントはグループ全体を再処理します。そして、このグループ内のすべての scopeWidget に対して update() を呼び出します。ウィジェットは再描画されます。これは機能します...</p>

問題: …自然発生した paintEvent です。ユーザーが何かを変更したとき – 私はこれが起こったことを知っており、ウィジェットの更新をエンキューする前に scopeGroup を処理できます。しかし、「他の何か」(システム自体) がペイント イベントを実行する場合、ペイントが発生する前にグループ全体を処理する必要があります。そのため、ペイント イベントは直接ペイントを行いませんが、scopeGroup 処理を実行します。その後、ペイント イベントがあったウィジェットをペイントし、そのグループ内の他のすべてのウィジェットに対して update() を呼び出します。これにより、新しいペイント イベントが発生します。次の scopeGroup 処理、1 つの paint()、および他のウィジェットの update() を引き起こします。これにより、新しい paint イベントが発生します。再帰的な再描画 (および scopeGroup 処理) として終了します。

不十分な解決策: フラグ – 自発的な描画イベントがグループ処理を行い、リクエストしているウィジェットに対して 1 つの paint() を実行し、グループ内の残りのウィジェットに対して update() を実行し、すべてのウィジェットにフラグを設定します。

この疑似コードは、このメカニズムを示しています。

paintEvent(QWidget *w)
 {
 if(w->flag)
 {
 w->paint(); w->flag=0;
 }
 else
 {
 w->group()->process();
 w->paint();
 QWidget *x;
 foreach(x,group) if(x!=w) { x->flag=1; x->update(); }
 }

IMHOの方が良いでしょう:

a) 事前のペイント イベント (または update() または repaint() の呼び出し) なしでウィジェットをペイントできる場合…これが最善の方法です;]、しかし、単純明快な方法では機能しません。他に方法はありますか? - また

b) ペイント イベントの代わりにカスタム関数を呼び出すようにシステムに強制する

これらの「より良い」ソリューションは可能ですか?

4

0 に答える 0