問題タブ [rust-gnome]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
gtk - rust-gnome を使用しているときに、自分のデータを GTK コールバックに渡すにはどうすればよいですか?
...または、どうすれば gtk::Widget をサブクラス化できますか?
my には次の依存関係がありますCargo.toml
。
独自のタイプのウィジェットを作成したい (フラクタルをレンダリングするため)。私は持っている:
しかし、redraw
gets が呼び出されると、 w はもちろん thegtk::DrawingArea
であり、 my ではありませんFractalWidget
。私はクロージャーを使って呼び出しconnect_draw
を試みましたが、それを使用result
することができませんでした (Box
結果を取得しmove
てラムダに入れようとしましたが、これは初めてなので、おそらく試していない方法があります) .
それで、私の実際の質問:より多くのデータをrust-gnome redrawメソッド(および他の同様のコールバック)に送信する方法はありますか、それともウィジェット構造体を拡張して自分のデータを含める方法はありますか?
callback - HOWTO: gtk によるコールバックのための慣用的な Rust (rust-gnome)
私は現在 Rust を学んでおり、GTK+ を使用した GUI ベースのアプリケーションの開発に使用したいと考えています。私の問題は、コールバックを登録して GTK イベント/シグナルに応答し、それらのコールバック内で状態を変更することに関連しています。私は機能しているが洗練されていない解決策を持っているので、よりクリーンで慣用的な解決策があるかどうか尋ねたい.
メソッドの実装を含む構造体としてコードを実装しました。この構造体は、GTK ウィジェットへの参照と必要なその他の状態を維持します。イベントを受け取ったり、キャンバスに描画したりするために、関数に渡されるクロージャーを構築し
GtkWidget::connect*
ます。これにより、これから説明するように、借用チェッカーで問題が発生する可能性があります。私はいくつかの機能を持っていますが、(IMHO)非理想的なコードを示します。
最初の、機能しない解決策:
上記は、クロージャー
が作成され、メソッドRenderingAPITestWindow::new
への呼び出しに渡され
て Borrow が試行されるため、コンパイルに失敗します。コンパイラは、クロージャーが宣言され、外部関数によって所有されている関数よりも長く存続する可能性があると述べているため、問題が発生します。GTK が不特定の時間の間、これらのクロージャへの参照を保持する可能性があることを考えると、実行時に有効期間を決定できるアプローチが必要です
。GtkWidget::connect*
instance
instance
RenderingAPITestWindow
Rc<RefCell<...>>
インスタンスをラップするとRenderingAPITestWindow
コンパイルされますが、実行時に停止します。
上記のソリューションはコンパイルされますが、特にきれいではありません。
RenderingAPITestWindow::new
Rc<RefCell<RenderingAPITestWindow>>
ではなく を 返しますRenderingAPITestWindow
- のフィールドとメソッドへのアクセスは、を開く必要が
RenderingAPITestWindow
あるため複雑です。Rc<RefCell<...>>
だけでwrapped_instance.borrow().some_method(...)
なく、instance.some_method(...)
- 各クロージャには、独自の
wrapped_instance
;のクローンが必要です。使用しようとすると、以前と同じように所有されているオブジェクト (今回wrapped_instance
ではなくラッパー) を借用しようとします。RenderingAPITestWindow
RenderingAPITestWindow::new
上記はコンパイルされますが、実行時に次のように終了します。
これは、 の呼び出しwindow.show_all()
によって GTK がウィジェット階層を初期化し、描画領域ウィジェットがsize-allocate
イベントを受け取るためです。ウィンドウにアクセスして呼び出す
には、を開き (したがって
)、インスタンスを借用するshow_all()
必要がありました。戻り時に借用が終了する前に、GTK は描画領域のイベント ハンドラーを呼び出します。これにより、それに接続されているクロージャー (上記の 4 行) が呼び出されます。クロージャーは、メソッドを呼び出すために、インスタンス ( )への変更可能な参照を借用しようとします。これは、最初の不変参照がまだスコープ内にある間に、可変参照を借用しようとします。この 2 回目の借用により、ランタイム パニックが発生します。Rc<RefCell<...>>
wrapped_instance.borrow().window.show_all();
show_all()
size-allocate
RenderingAPITestWindow
wrapped_instance_for_sizealloc.borrow_mut().on_size_allocate(rect);
on_size_allocate
私がこれまでに何とか機能させてきた、機能しているが-IMHO-洗練されていない解決策は、RenderingAPITestWindow
2つの構造体に分割し、コールバックによって変更される可変状態を別の構造体に移動することです。
構造体を分割する、機能しているが洗練されていないソリューションRenderingAPITestWindow
:
上記のコードは必要に応じて機能しますが、前進するためのより良い方法を見つけたいと思います。Rc<RefCell<...>>
Rustの借用規則を満たすために構造体を使用および分割する必要があるため、上記はプログラミングプロセスをかなり複雑にするため、より良いアプローチを誰かが知っているかどうかを尋ねたいと思います。
combobox - Rustのgtk-rsバインディングでListStore内にListStoreを追加するには?
gtk-rs bindingsを使用して es をTreeView
含むプログラムを作成したいと考えています。ComboBox
のデータを取得するにはGtkCellRendererCombo
が必要ですが、の中GtkTreeModel *
に を追加する方法がわかりません。ListStore
ListStore
今のところ、私は単純なものしか持っていませんTreeView
。ComboBox
内側の 1 列 (ヘッダー "f64")が必要です。
に追加してから、ボックス化されたを に追加しようとしgtk::Type:BaseBoxed
ましたが、メソッドによってtypeに正常に変換できません。types_inside_columns
ListStore
array_of_data
Box
to_value()
ToValue
追加: このプログラムは実行時にパニックを起こします: