GTK
はじめに
編集GTK(GIMP Toolkit)は、クロスプラットフォームのGUIツールキットです。このハンドブックでは、GTKの基本概念から実践的な使用方法まで解説します。
このハンドブックでは特記ない限り、C言語バインディングのAPIのコードを紹介します。
基本概念
編集ウィジェット階層
編集GTKのGUIは、ウィジェットの階層構造で構成されます:
- トップレベルウィンドウ
- コンテナウィジェット
- 基本ウィジェット
- カスタムウィジェット
シグナルとイベント
編集- シグナル:ウィジェットの状態変化を通知
- イベント:ユーザー入力や外部からの通知
- コールバック:シグナルやイベントに対する処理
基本的なウィジェット
編集ウィンドウ関連
編集// メインウィンドウの作成 GtkWidget *window = gtk_window_new(); gtk_window_set_title(GTK_WINDOW(window), "Example"); gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
コンテナウィジェット
編集- Box:水平/垂直のレイアウト
- Grid:格子状のレイアウト
- Paned:分割可能なコンテナ
- Notebook:タブ付きコンテナ
基本的な入力ウィジェット
編集- Button:クリック可能なボタン
- Entry:一行テキスト入力
- TextView:複数行テキスト入力
- CheckButton:チェックボックス
- RadioButton:ラジオボタン
レイアウト管理
編集Boxレイアウト
編集GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_box_append(GTK_BOX(box), button1); gtk_box_append(GTK_BOX(box), button2);
Gridレイアウト
編集GtkWidget *grid = gtk_grid_new(); gtk_grid_attach(GTK_GRID(grid), widget1, 0, 0, 1, 1); gtk_grid_attach(GTK_GRID(grid), widget2, 1, 0, 1, 1);
イベント処理
編集シグナルの接続
編集g_signal_connect(button, "clicked", G_CALLBACK(on_button_clicked), NULL); void on_button_clicked(GtkButton *button, gpointer user_data) { // クリック時の処理 }
イベントコントローラー
編集GtkEventController *controller = gtk_event_controller_key_new(); gtk_widget_add_controller(widget, controller);
スタイリング
編集CSSの適用
編集GtkCssProvider *provider = gtk_css_provider_new(); gtk_css_provider_load_from_data(provider, "button { background: red; }", -1);
テーマの設定
編集g_object_set(gtk_settings_get_default(), "gtk-theme-name", "Adwaita", NULL);
ダイアログとポップアップ
編集メッセージダイアログ
編集GtkWidget *dialog = gtk_message_dialog_new( parent_window, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Message" );
ファイル選択ダイアログ
編集GtkWidget *dialog = gtk_file_chooser_dialog_new( "Open File", parent_window, GTK_FILE_CHOOSER_ACTION_OPEN, "_Cancel", GTK_RESPONSE_CANCEL, "_Open", GTK_RESPONSE_ACCEPT, NULL );
データモデルとビュー
編集ListStore
編集GtkListStore *store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT); gtk_list_store_insert_with_values(store, NULL, -1, 0, "Item", 1, 42, -1);
TreeView
編集GtkWidget *view = gtk_tree_view_new_with_model( GTK_TREE_MODEL(store)); GtkTreeViewColumn *column = gtk_tree_view_column_new(); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
メニューとツールバー
編集メニューバー
編集GMenu *menu = g_menu_new(); g_menu_append(menu, "New", "app.new"); g_menu_append(menu, "Open", "app.open");
ツールバー
編集GtkWidget *toolbar = gtk_toolbar_new(); GtkToolItem *new_button = gtk_tool_button_new(NULL, "New"); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), new_button, -1);
アプリケーション設定
編集GSettings
編集GSettings *settings = g_settings_new("org.example.app"); g_settings_set_string(settings, "username", "user");
キーバインディング
編集gtk_application_set_accels_for_action(GTK_APPLICATION(app), "app.quit", {"<Ctrl>Q", NULL});
非同期処理
編集GTask
編集void do_async_operation(GTask *task) { // 非同期処理 g_task_return_boolean(task, TRUE); } g_task_new(NULL, NULL, callback, user_data);
デバッグとプロファイリング
編集GTKインスペクタ
編集GTK_DEBUG=interactive ./application
メモリプロファイリング
編集G_DEBUG=gc-friendly G_SLICE=always-malloc valgrind ./application
パフォーマンス最適化
編集ウィジェットのキャッシュ
編集static GtkWidget *cached_widget = NULL; if (!cached_widget) { cached_widget = create_complex_widget(); }
レンダリング最適化
編集gtk_widget_set_double_buffered(widget, TRUE);
セキュリティ考慮事項
編集- 入力のバリデーション
- ファイルアクセスの制限
- 権限の適切な管理
ベストプラクティス
編集- 一貫したコーディングスタイル
- 適切なエラー処理
- リソースの適切な解放
- モジュール化と再利用性
- ドキュメント化
トラブルシューティング
編集一般的な問題と解決方法:
- シグナル接続の失敗
- メモリリーク
- ウィジェットの表示問題
- イベント処理の問題
まとめ
編集GTKは強力で柔軟なGUIツールキットです。基本概念を理解し、適切な実装方法を選択することで、効率的なアプリケーション開発が可能になります。