2

クリック アンド ドラッグの感覚を持つ C++/Qt を使用してエディターを構築しています。この動作は、回路図エディタ (Eagle、KiCAD など)、Microsoft Visio、またはオブジェクトをツールバーから中央の編集領域にドラッグするその他のプログラムに似ています。

私の問題は、ユーザーがカスタム ウィジェット内をクリックしたときに、ボックスのようなオブジェクトのインスタンスを選択して操作できるようにしたいということです。ボックス同士をつなぐ線もあります。しかし、それらのオブジェクトを選択するための効率的な方法を決定することはできません。

このためのプログラミング方法について、主に 2 つの考えがあります。1 つ目は、エディター全体を描画しているウィジェットが、ボックスのすべてのインスタンスを単純にカプセル化するということです。もう 1 つは、ボックスの各インスタンス (これは私のモデルにあります) に、ボックスのレンダリングを処理する QWidget のインスタンスを持たせることです (これは私のビューにあります... しかし、それは最終的に強く接続されますモデル)。それらを接続する線については、正方形の境界ボックスがないため、含まれているウィジェットによってレンダリングする必要があります。

したがって、これがどのように行われるかを要約すると、次のようになります。

  • エディター ウィジェットは、ウィジェットを保持するコンテナーになり、ウィジェットは独自のクリック イベントを処理します。ここで考えられる問題は、カスタム ウィジェットをレイアウトにして、クリック アンド ドラッグ機能を使用できるようにする方法がわからないことです。
  • エディター ウィジェットは、すべてのレンダリングを処理し、マウス クリックを処理します (レイアウトについて心配する必要がないという点でより簡単な方法です...インスタンスを効率的に選択するだけで、何が最適かわかりません)。

これで、少し背景ができたので、2 番目の方法では、ボックスのような各インスタンスに境界四角形を持たせ、線を 3 ~ 4 ピクセル幅の境界四角形セグメント (90 度の角度) で表すことを計画しています。 . すべてのボックスと行を反復処理することはできますが、それは非常に非効率的です。

大きな問題: 長方形を保持し、それらをウィジェット (またはそれ以外のもの) にリンクし、それに 2 つの座標 (マウス座標など) を指定して、バウンディング ボックスから吐き出すことができる何らかのデータ構造はありますか?またはそれらの座標が内部にあるリンクされたオブジェクト?

4

1 に答える 1

2

あなたの本当の質問は、長方形の交差点のパフォーマンスの詳細ではなく、エディターを実装する良い方法を見つけることであるようです。

APIのデモを行うQt の"Diagram Scene" サンプル プロジェクトに興味があるかもしれません。QGraphicsSceneあなたが説明するシナリオにぴったりのように思えます。(サンプルの完全なソースは Qt に同梱されています。)

ここに画像の説明を入力

最良の部分は、API が探しているもの (たとえば、QGraphicsScene::itemAt()) を既に提供しているため、自分でヒット テストを実装する必要がないことです。

内部でQGraphicsSceneは、単純な反復メソッドを使用してヒット テストを実行することに注意してください。他の人が指摘しているように、シーンに多くの個別のアイテムがない限り、これは深刻なボトルネックにはなりません。

于 2012-10-21T09:09:21.960 に答える