コンテンツにスキップ

GTK

出典: フリー教科書『ウィキブックス(Wikibooks)』

はじめに

[編集]

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});

非同期処理

[編集]

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

セキュリティ考慮事項

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

ベストプラクティス

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

トラブルシューティング

[編集]

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

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

まとめ

[編集]

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

下位階層のページ

[編集]