2

私はグレードを使用して .ui ファイルを作成し、それを使用しGtkBuilderてその .ui ファイル全体を C プログラムにロードしているため、すべてのウィジェットやものはビルダー ファイル自体から作成されます。

以前は、コード自体からのみウィジェットを作成していたので、2 番目の引数がgpointer変数であるため、任意のタイプのデータを Callback に渡すことができ、いつでもカスタムメイドの構造体へのポインターを作成し、任意のタイプのデータを渡すことができました。コールバック。

しかし今、信号に接続するために、この単純な関数を使用しています:

gtk_builder_connect_signals(builder, NULL);

builderのポインタGtkBuilderです。

これにより、glade ファイルで言及されているすべてのシグナルが、.c ファイルで定義されている関数のシグナルと接続されます。ウィジェット以外の user_data を渡す規定はありません (それ自体は、glade でのみ定義できます)。

あらゆるタイプのデータをコールバックに渡すことができるように、誰かが解決策を教えてくれますか? 時間を大幅に節約できるので、空き地を離れたくないので、コードのみでウィジェットを作成する従来の方法に切り替えたくありません。

g_connect_signal() と gtk_builder_connect_signals() の両方を使用した例が役に立ちます。この場合、シグナル接続をオーバーライドするために最初に呼び出すもの。

4

2 に答える 2

1

gtk_builder_get_objectウィジェットの名前を指定して、Glade によって作成された任意のウィジェットを取得するために呼び出すことができます。g_connect_signalその後、通常のAPIを使用してウィジェットをシグナルに接続できます。欠点は、空き地の定義でシグナルを単純に「言及」することができなくなったことです。

もう 1 つの方法は、 を使用gtk_builder_get_objectしてオブジェクトを取得することですが、 を呼び出しg_object_set_qdataて、必要なユーザー データをGQuark既知のキーに関連付けます。コールバックはg_object_get_qdata、同じキーを使用してウィジェットからユーザー データを取得できます。これには、まだ使用しているという利点がありますgtk_builder_connect_signals

于 2013-04-07T15:38:41.980 に答える