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ツールキットです。基本概念を理解し、適切な実装方法を選択することで、効率的なアプリケーション開発が可能になります。