メニューアンカーで生成したウィジェットから変数を取得したい

親ウィジェットのメニューアンカーで生成された子ウィジェットにあるエディタブルテキストボックスに入力されたテキスト変数を取得して親ウィジェットに表示されているテキストを編集したいと思っています。


297407-
自分なりに組んでみたのですが簡単に説明すると
メニューアンカーで呼び出された子ウィジェットで何か入力されたら親ウィジェットのsettexイベントをディスパッチャーで呼び出し、ディスパッチャーを通して入力されたテキストの変数を親に渡し親側で渡されたテキストを使って編集用テキストを編集します。

これでコンパイルし実行してみるとエラーこそ出ないものの、テキストボックスを入力しても親側のテキストが変わりませんでした。
そこでテストとして子ウィジェットの「入力イベント直後」と「settexイベント呼び出し直後」にprintstringを繋いで実行してみたところ、「settexイベント呼び出し直後」の方は表示されず機能していないようなので恐らくここに問題があってイベントがうまく呼び出せていないんだと思われますが、解決方法が分かりません。

また同じことを実現するために別のもっといい方法がありましたらそちらも教えていただきたいです。よろしくお願いします。

menu anchor

イベントディスパッチャーは呼び出し元で定義し、受け取り先でバインドの設定を行います。
今回の場合、子ウィジェット側の変更によって親ウィジェットのイベントを呼び出したい、つまり子が呼び出し元で親が受け取り先となるので、最初に子ウィジェット側で定義して呼び出しを行います。

続いて親側でイベントディスパッチャーを受け取れるように、子の参照を取得します。今回はMenuAnchorを使って子ウィジェットを生成しているので、OnGetMenuContent(Detailsの下の方にあります)で子ウィジェットを手動で作り、それを変数(ここではChildWidgetRef)に入れておきます。

297423-b-menuanchor.png

最後に親側のバインドを完成させます。先ほど作ったOnGetMenuContent関数はMenuAnchorがOpenするたびに実行されるので、変数(ChildWidgetRef)から子ウィジェットへアクセスできます。ここで最初に作ったイベントディスパッチャへ「割り当てる」を選ぶと、引数のついたカスタムイベントが自動で生成されるので、あとは引数の内容を親ウィジェットのテキストボックスへ渡します。

ありがとうございました無事にできました。

もう少し教えてえほしいのですが「イベントディスパッチャーは呼び出し元で定義し、受け取り先でバインドの設定を行います。」とありましたが、似たような状況で少し前に質問した時に受け取り先で定義するというアドバイスを貰ったので今回それを応用しようとしたのですが、呼び出し元で定義するというのは今回だけでなくいつも原則としてこれでやった方がいいのでしょうか?

前回の質問を拝見しましたが、私の意見としては、今回のように呼び出し元で定義していいと思います。というのは、前回の方法は、単に参照先の関数やイベントを呼び出していることと変わりがないからです。

イベントディスパッチャーはデリゲートといわれるものの一種で、発信元はイベントを発行したあと、それを何のアクターが受け取るかやどう扱うかを意識しないで済むようにできることが特徴です。しかし前回の方法では、発信元がわざわざ受け手をキャストして呼び出すという形になっています。これでは、仮に今後このイベントを受け取るアクターが増えれば、それだけ発信元で呼び出し先を増やして定義して…と繰り返すことになり、イベントディスパッチャーのメリットを生かせないと思います。

前回は生成されたものを親の参照変数に入れる方法が分からなかったのが敗因でしたので今回のアンサーはいろいろ助かりました。ありがとうございました。