はじめに

編集

GTK(GIMP Toolkit)は、クロスプラットフォームのGUIツールキットです。このハンドブックでは、GTKの基本概念から実践的な使用方法まで解説します。

このハンドブックでは特記ない限り、C言語バインディングのAPIのコードを紹介します。

基本概念

編集

ウィジェット階層

編集

GTKのGUIは、ウィジェットの階層構造で構成されます:

  1. トップレベルウィンドウ
  2. コンテナウィジェット
  3. 基本ウィジェット
  4. カスタムウィジェット

シグナルとイベント

編集
  • シグナル:ウィジェットの状態変化を通知
  • イベント:ユーザー入力や外部からの通知
  • コールバック:シグナルやイベントに対する処理

基本的なウィジェット

編集

ウィンドウ関連

編集
// メインウィンドウの作成
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});

非同期処理

編集
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);

セキュリティ考慮事項

編集
  • 入力のバリデーション
  • ファイルアクセスの制限
  • 権限の適切な管理

ベストプラクティス

編集
  1. 一貫したコーディングスタイル
  2. 適切なエラー処理
  3. リソースの適切な解放
  4. モジュール化と再利用性
  5. ドキュメント化

トラブルシューティング

編集

一般的な問題と解決方法:

  1. シグナル接続の失敗
  2. メモリリーク
  3. ウィジェットの表示問題
  4. イベント処理の問題

まとめ

編集

GTKは強力で柔軟なGUIツールキットです。基本概念を理解し、適切な実装方法を選択することで、効率的なアプリケーション開発が可能になります。

下位階層のページ

編集