1

私は次のことに悩まされています:

QGraphicsSceneクエリに何か(テーブル、新しい列、その他)を追加したり、クエリから何かを削除したりするなど、ユーザーの操作に基づいてSQLクエリのグラフィック表現をレンダリングする必要があるインタラクティブ機能を使用しています。 (キーワード、テーブル、列...)。シーンの変更は操作後に表示する必要があります。また、クエリの「レンダリング」は「ロジック」レイヤーによって行われるため、アプリケーションの「ロジックレイヤー」はユーザーが行った操作を追跡する必要があります(例: 「ロジックレイヤー」は、すべてのQGraphicsItemGroup派生オブジェクトを作成します。これらのオブジェクトは、すべてのロジックレイヤーコンポーネントが構築された後、クエリのグラフィックシーンに追加され、ウィンドウに配置されます。

発生する問題は次のとおりです。現在、可能な限りスムーズな方法で変更した後、クエリを表示するための使用可能なソリューションを見つけることができませんでした。

詳細な説明のためにスクリーンショットにリンクさせてください:

クエリビルダーのスクリーンショット

ユーザーがPERSON.NAMEクエリから列を削除したいとします。アプリケーションで何が起こるか:

  • PERSON.NAMEユーザーは、列のグラフィックアイテムの[削除](列名の後にある小さな赤いX)ボタンをクリックします。
  • グラフィックビューはこの操作を検知し、REMOVE列をグラフィックシステムから「ロジックレイヤー」(「モデル」)に送信します。
  • PERSON.NAMEロジックレイヤーは、その順番で、列を表す対応する「ロジックレイヤー」オブジェクトを削除します。

そしてここで問題が始まります:

  • グラフィック全体(はい、すべて)がロジックレイヤーによって再レンダリングされ、同じクエリのグラフィックアイテムが作成されます。PERSON.NAME
  • QGraphicsScene次に、新しいオブジェクトと一緒に新しいウィンドウを作成する必要がありますQGraphicsView
  • クエリを表す再レンダリングされたオブジェクトのグラフィックアイテムを(ただし、PERSON.NAME列なしで)新しいQGraphicsScenewithに挿入します。addItem()
  • そして、アプリケーションの中央ウィジェットを新しいウィンドウに置き換えます。
  • これで、実際、クエリでPERSON.NAMEがもう存在せず、下にあったすべてのグラフィック要素がPERSON.NAME画面上で上に移動したことがわかります。

明らかにこれは良い解決策ではありません。ウィンドウを変更すると醜いちらつきがありますが、これまでこの問題に対するより良い解決策は見つかりませんでした。

したがって、新しいウィンドウなしで、上記の背景情報を知っている新しい要素の削除(追加)時に画面を更新するこの方法論に対してどのような改善を行うことができるかを特定するために、あなたの助けを求めています。明らかに他の、mroeの一般的なグラフィック関連のコメントも歓迎します。

ありがとう

4

1 に答える 1

3

質問とコメントからの情報に基づいて、いくつかのことを検討できます。

最初に、新しい Window の作成と更新時の new を取り除くQGraphicsView必要があるということです。これがちらつきの主な原因だと思います。UI 構造を変更せずに、シーンのみを変更します。次のいずれかの方法を使用できます。

  1. 新しいシーンを作成しQGraphicsSceneてビューのシーンとして設定するかclear()、既存のシーンを呼び出します。次にQGraphicsItems、ネイティブ モデルから再作成し、すべてのポインターと参照が更新されていることを確認します。

  2. もう 1 つの方法は、何かが変更されたときにネイティブ モデルをQGraphicsScene 更新して、シーン全体を最初から再作成する必要がないようにすることです。たとえば、ユーザーが削除アイコンをクリックしたときにQGraphicsSceneの削除を処理し、シーンがネイティブ モデルを更新してこの変更を反映するようにします。QGraphicsItem

  3. さらに別のアプローチは、ネイティブ モデルを破棄QGraphicsSceneし、それQGraphicsItemsをモデルとして使用することです。シーンクラスにシリアライズなどを実装。これにより、2 つのモデルを同期する必要がなくなります。欠点は、グラフィックに依存しないロジックが と非常に緊密に結合されるQGraphicsSceneことです。これは望ましくない場合があります。コードのサイズによっては、これも大変な作業になる場合があります。

1. から始めます。これは、既存のアプローチに基づいた最も簡単な方法と思われるためです。それでもポインターとオブジェクトの所有権に関する奇妙な問題に遭遇する場合は、それらを分離して SO に質問してみてください :)

于 2013-01-17T08:58:39.963 に答える