0

私は単純なウィジェット システムに取り組んでおり、現在いくつかのコンテナーを実装しています。

これが私がいる状況です:

  • Widget基本クラス、他のウィジェットを含むことができるウィジェットであるクラスContainer、および のようないくつかのウィジェット サブクラスがありますButton
  • コンテナには 2 つのタイプがあります。Container子を絶対的に配置するそれ自体とBox、ウィジェットを水平または垂直に並べてスタックする です。
  • 各ウィジェットは、x=0、y=0 で自分自身を描画します。したがって、コンテナーは、ウィジェットが自分自身を描画するように指示される前に、描画コンテキストにオフセットを追加する必要があります。
  • 各ウィジェットは、x/y 位置に基づいて独自のヒット テストを行います。

これまでのところ、問題なく動作しています。しかし、私が実装しているので、それはバラバラになります:私がしていることは、継承されBoxた関数を上書きして、x/y 位置に基づいてではなく、それらをすべて並べて描画することです。とてもシンプルです。drawContainer

しかし、ウィジェットの x/y 位置が無意味になったため、イベント処理は完全にオフになっています。

次の 2 つのオプションがあると思います。

  1. 描画のように、x=0、y=0 の位置でウィジェットにヒット テストを実行させます。次に、マウスの位置を で一致するように再計算しContainerます。
  2. 各レイアウト セットをその子に対して x/y にし、子に x/y 位置で再び自分自身を描画させます。描画コンテキストのオフセットはもうありません

最初のものは少し醜いと思います。2 つ目の実装は、ウィジェットの位置の変更に対応する必要があるため、かなり複雑です。

Qt、Gtk、wxWidgets などの他のウィジェット システムは、一般的にこれにどのように取り組んでいますか? これらのいくつかのソースを見てきましたが、洗練されすぎているため、よくわかりません。考慮すべきサイズ変更や梱包の問題はありません。

4

1 に答える 1

1

独自のレイアウト システムを実装しようとしています。難しいと予想する必要があります。最初の方法に反対することをお勧めします。ウィジェットの x、y 座標は、ウィジェット自体によって使用されるだけでなく、ウィジェットで何かをしたいコンテナー外のすべてのユーザーによって使用されます。

2 番目の解決策は、複数の小さなウィジェットで構成されるカスタム ウィジェットを実装するために私が選択したものです。あまり多くの機能が必要ない場合は、まとめるのはそれほど難しくありません。ウィジェットがコンテナーに追加されたときにウィジェットを取得し、その位置を現在の空きスポットに設定して、次の場所に移動するだけです。

于 2013-03-16T09:12:21.467 に答える