私はGtkとGladeでアプリケーションを開発しています。私の印象では、メインウィンドウ用にGtkWindowのサブクラスを作成するのが一般的ですが、GtkBuilder定義からサブクラスを構築する方法に固執しています。誰かが方法を知っていますか?
3 に答える
サブクラスGtkWindow
化は、プレーンCよりもGTKのさまざまな言語バインディングで一般的です。使用している言語については言及していません。
そうは言っても、Cでサブクラス化する方法はGtkWindow
、Gladeでウィンドウのコンテンツを作成することですが、ウィンドウ自体は作成しません。Glade 3(IIRC)では、パレット内のウィジェットを右クリックし、[ウィジェットをトップレベルとして追加]を選択して、コンテナーなしで非トップレベルのウィジェットを配置できます。
次に、のサブクラスのコードを記述します。GtkWindow
それをと呼びましょうMyAppWindow
。GObjectのドキュメントにはたくさんの例があるので、この回答ではそれについては説明しません。init関数(my_app_window_init()
)で、Gladeファイルをロードし、を使用gtk_builder_get_object()
してGladeファイルの最も外側のウィジェットへのポインターを取得し、gtk_container_add()
それを作成中のウィンドウに追加します。その後gtk_builder_connect_signals()
、通常どおりに使用します。
Gladeでは設定できないため、この方法ですべてのウィンドウのプロパティを手動で設定する必要がありますが、それ以外は非常にうまく機能することがわかりました。
GtkWindowをサブクラス化することは一般的な方法ではありません。
gtkbuilder定義から作成されたトップレベルウィンドウをサブクラス化することはできないと思います。
gtkbuilderは、作成する前にサブクラス化されたウィジェットについて知る必要があります。
本当にGtkWindowの独自のサブクラスを作成したい場合は、ptomatoが基本的な手順をよく説明しています。gladeのプラグインを作成して、カスタムウィジェットを利用できるようにすることもできます。しかし、これは非常に簡単ではなく、おそらくあなたがやりたいことではありません。
ほとんどのアプリケーションは、標準のウィジェットのみを使用し、それらをサブクラス化することはありません。次に、gtkbuilder(またはlibglade)を使用してgladeファイルをロードする場合、GUI用の特別なクラス(他のRADツールのように)は必要ありません。代わりに、オブジェクトのセットを取得するだけです。APIを使用すると、名前でそれらを検索できます(ウィンドウは基本的にそれらの1つにすぎません)。一般的なアプローチは、操作するすべてのウィジェットを検索し、プログラムの起動時にそれらをグローバル変数に格納することです。または、ウィンドウの複数のインスタンスが必要な場合は、それらを格納する構造体を作成できます。または、必要になるたびにウィジェットを簡単に検索できます。取得するオブジェクトのセットは完全に動的であることに注意してください。たとえば、GUIをプログラムで作成した場合と同じように、ウィジェットを異なるウィンドウ間で移動できます。