1

最近、GTK機能を習得するためにC++プロジェクトを開始しました。私は常にJavaでプログラミングしているので、C++アプローチを使用しました。

現在、GTKライブラリはCコードで記述されているので、クラスとCコードスタイルの組み合わせを実現しました。私の問題の1つは、GTKイベントがコールバック関数で機能することです。これらのイベントをクラスにカプセル化するために、静的メソッドを使用しました。

重要なのは、静的メソッドと静的変数がクラス内からは見えないことです。さらに、クラスの.cppファイルでのみ宣言され、コールバック内から呼び出され、クラスから完全に分離された他の静的関数をいくつか作成しました。 。

このアプローチは少し不器用なように思われるので、クラスでこれらのコールバックを処理し、クラスのメソッドや構造とエレガントな方法で対話できるようにするための最良のアプローチはありますか?

ありがとう!

4

3 に答える 3

6

はい、user_dataパラメーターで状態(たとえば、このポインター、またはスロット/ファンクターへのポインター)を渡す必要があります。そうしないと、メンバーメソッドを呼び出すためのクラスインスタンスができなくなります。

これはgtkmmが行うことです。たとえば、Gtk :: Container :: foreach()は静的(非メンバー)関数を使用して、提供されたsigc :: slotを渡します:http: //git.gnome.org/browse/gtkmm/tree/gtk/src /container.ccg#n166

シグナルのコード(質問でイベントと呼ぶもの)は似ていますが、少し複雑です-gtkmmで生成された.ccコードでそれを見ることができます。

しかし、gtkmmだけを使うべきだとも思います。これは、他の方法では自分で解決する(しない)結果になるいくつかの問題の1つにすぎません。

于 2012-04-20T09:15:12.400 に答える
3

代わりにGtkmmを調べることをお勧めします。

于 2012-04-20T07:48:45.543 に答える
2

補足として、GTKライブラリはCで記述されていますが、他の言語からそれらを使用するためのバインディングがあります。

  • C++→GTKmm
  • python→pyGTK(GTK2の場合)、pyGObject(GTK3の場合)
  • Java→java-gnome

于 2012-04-20T10:04:34.567 に答える