クリック アンド ドラッグの感覚を持つ C++/Qt を使用してエディターを構築しています。この動作は、回路図エディタ (Eagle、KiCAD など)、Microsoft Visio、またはオブジェクトをツールバーから中央の編集領域にドラッグするその他のプログラムに似ています。
私の問題は、ユーザーがカスタム ウィジェット内をクリックしたときに、ボックスのようなオブジェクトのインスタンスを選択して操作できるようにしたいということです。ボックス同士をつなぐ線もあります。しかし、それらのオブジェクトを選択するための効率的な方法を決定することはできません。
このためのプログラミング方法について、主に 2 つの考えがあります。1 つ目は、エディター全体を描画しているウィジェットが、ボックスのすべてのインスタンスを単純にカプセル化するということです。もう 1 つは、ボックスの各インスタンス (これは私のモデルにあります) に、ボックスのレンダリングを処理する QWidget のインスタンスを持たせることです (これは私のビューにあります... しかし、それは最終的に強く接続されますモデル)。それらを接続する線については、正方形の境界ボックスがないため、含まれているウィジェットによってレンダリングする必要があります。
したがって、これがどのように行われるかを要約すると、次のようになります。
- エディター ウィジェットは、ウィジェットを保持するコンテナーになり、ウィジェットは独自のクリック イベントを処理します。ここで考えられる問題は、カスタム ウィジェットをレイアウトにして、クリック アンド ドラッグ機能を使用できるようにする方法がわからないことです。
- エディター ウィジェットは、すべてのレンダリングを処理し、マウス クリックを処理します (レイアウトについて心配する必要がないという点でより簡単な方法です...インスタンスを効率的に選択するだけで、何が最適かわかりません)。
これで、少し背景ができたので、2 番目の方法では、ボックスのような各インスタンスに境界四角形を持たせ、線を 3 ~ 4 ピクセル幅の境界四角形セグメント (90 度の角度) で表すことを計画しています。 . すべてのボックスと行を反復処理することはできますが、それは非常に非効率的です。
大きな問題: 長方形を保持し、それらをウィジェット (またはそれ以外のもの) にリンクし、それに 2 つの座標 (マウス座標など) を指定して、バウンディング ボックスから吐き出すことができる何らかのデータ構造はありますか?またはそれらの座標が内部にあるリンクされたオブジェクト?