問題タブ [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.

0 投票する
1 に答える
777 参照

gtk - rust-gnome を使用しているときに、自分のデータを GTK コールバックに渡すにはどうすればよいですか?

...または、どうすれば gtk::Widget をサブクラス化できますか?

my には次の依存関係がありますCargo.toml

独自のタイプのウィジェットを作成したい (フラクタルをレンダリングするため)。私は持っている:

しかし、redrawgets が呼び出されると、 w はもちろん thegtk::DrawingAreaであり、 my ではありませんFractalWidget。私はクロージャーを使って呼び出しconnect_drawを試みましたが、それを使用resultすることができませんでした (Box結果を取得しmoveてラムダに入れようとしましたが、これは初めてなので、おそらく試していない方法があります) .

それで、私の実際の質問:より多くのデータをrust-gnome redrawメソッド(および他の同様のコールバック)に送信する方法はありますか、それともウィジェット構造体を拡張して自分のデータを含める方法はありますか?

0 投票する
1 に答える
2272 参照

callback - HOWTO: gtk によるコールバックのための慣用的な Rust (rust-gnome)

私は現在 Rust を学んでおり、GTK+ を使用した GUI ベースのアプリケーションの開発に使用したいと考えています。私の問題は、コールバックを登録して GTK イベント/シグナルに応答し、それらのコールバック内で状態を変更することに関連しています。私は機能しているが洗練されていない解決策を持っているので、よりクリーンで慣用的な解決策があるかどうか尋ねたい.

メソッドの実装を含む構造体としてコードを実装しました。この構造体は、GTK ウィジェットへの参照と必要なその他の状態を維持します。イベントを受け取ったり、キャンバスに描画したりするために、関数に渡されるクロージャーを構築し GtkWidget::connect*ます。これにより、これから説明するように、借用チェッカーで問題が発生する可能性があります。私はいくつかの機能を持っていますが、(IMHO)非理想的なコードを示します。

最初の、機能しない解決策:

上記は、クロージャー が作成され、メソッドRenderingAPITestWindow::newへの呼び出しに渡され て Borrow が試行されるため、コンパイルに失敗します。コンパイラは、クロージャーが宣言され、外部関数によって所有されている関数よりも長く存続する可能性があると述べているため、問題が発生します。GTK が不特定の時間の間、これらのクロージャへの参照を保持する可能性があることを考えると、実行時に有効期間を決定できるアプローチが必要です 。GtkWidget::connect*instanceinstanceRenderingAPITestWindowRc<RefCell<...>>

インスタンスをラップするとRenderingAPITestWindowコンパイルされますが、実行時に停止します。

上記のソリューションはコンパイルされますが、特にきれいではありません。

  • RenderingAPITestWindow::newRc<RefCell<RenderingAPITestWindow>>ではなく を 返します RenderingAPITestWindow
  • のフィールドとメソッドへのアクセスは、を開く必要がRenderingAPITestWindowあるため複雑です。Rc<RefCell<...>>だけで wrapped_instance.borrow().some_method(...)なく、 instance.some_method(...)
  • 各クロージャには、独自のwrapped_instance;のクローンが必要です。使用しようとすると、以前と同じように所有されているオブジェクト (今回wrapped_instanceではなくラッパー) を借用しようとします。RenderingAPITestWindowRenderingAPITestWindow::new

上記はコンパイルされますが、実行時に次のように終了します。

これは、 の呼び出しwindow.show_all()によって GTK がウィジェット階層を初期化し、描画領域ウィジェットがsize-allocateイベントを受け取るためです。ウィンドウにアクセスして呼び出す には、を開き (したがって )、インスタンスを借用するshow_all()必要がありました。戻り時に借用が終了する前に、GTK は描画領域のイベント ハンドラーを呼び出します。これにより、それに接続されているクロージャー (上記の 4 行) が呼び出されます。クロージャーは、メソッドを呼び出すために、インスタンス ( )への変更可能な参照を借用しようとします。これは、最初の不変参照がまだスコープ内にある間に、可変参照を借用しようとします。この 2 回目の借用により、ランタイム パニックが発生します。Rc<RefCell<...>>wrapped_instance.borrow().window.show_all();show_all()size-allocateRenderingAPITestWindowwrapped_instance_for_sizealloc.borrow_mut().on_size_allocate(rect);on_size_allocate

私がこれまでに何とか機能させてきた、機能しているが-IMHO-洗練されていない解決策は、RenderingAPITestWindow2つの構造体に分割し、コールバックによって変更される可変状態を別の構造体に移動することです。

構造体を分割する、機能しているが洗練されていないソリューションRenderingAPITestWindow:

上記のコードは必要に応じて機能しますが、前進するためのより良い方法を見つけたいと思います。Rc<RefCell<...>>Rustの借用規則を満たすために構造体を使用および分割する必要があるため、上記はプログラミングプロセスをかなり複雑にするため、より良いアプローチを誰かが知っているかどうかを尋ねたいと思います。

0 投票する
1 に答える
747 参照

combobox - Rustのgtk-rsバインディングでListStore内にListStoreを追加するには?

gtk-rs bindingsを使用して es をTreeView含むプログラムを作成したいと考えています。ComboBox

のデータを取得するにはGtkCellRendererComboが必要ですが、の中GtkTreeModel *に を追加する方法がわかりません。ListStoreListStore

今のところ、私は単純なものしか持っていませんTreeViewComboBox内側の 1 列 (ヘッダー "f64")が必要です。

に追加してから、ボックス化されたを に追加しようとしgtk::Type:BaseBoxedましたが、メソッドによってtypeに正常に変換できません。types_inside_columnsListStorearray_of_dataBoxto_value()ToValue

追加: このプログラムは実行時にパニックを起こします: