GTK ツリービューの原理と使用法の分析

GTK ツリービューの原理と使用法の分析

GtkTreeView コンポーネントは、美しい通常のリストやツリーのようなリストを作成できる高度なコンポーネントです。この構造には 1 行以上を含めることができます。彼の構造はどうですか?有名なMVC(モデル・ビュー・コントローラー)設計フレームワークを採用しています。つまり、データと表示方法が分離されているのです。

したがって、GtktreeView コンポーネントには、実際には他の独立したオブジェクト構造 (オブジェクト) がいくつかあります。

GtkCellRenderer は、GtkTreeViewColumn のデータの表示方法を決定します。

GtkListStore と GtkTreeStore の機能は、モデルの役割を反映することです。

つまり、GtkTreeView に表示されるデータを処理および分析するために使用されます。

GtkTreeIter は、GtkTreeView コンポーネントの行のデータに対して操作を行うために使用されるデータ構造です。

オプションを処理するには GtkTreeSelection が使用されます。

効果は以下のとおりです

コードは次のとおりです

#include <gtk/gtk.h>

列挙型
{
  リスト項目 = 0、
  N_列
};

void init_list(GtkWidget *リスト)
{

  GtkCellRenderer *レンダラー;
  GtkTreeViewColumn *列;
  GtkListStore * ストア;

  レンダラー = gtk_cell_renderer_text_new();
  column = gtk_tree_view_column_new_with_attributes("リスト項目",
       レンダラー、「テキスト」、LIST_ITEM、NULL);
  gtk_tree_view_append_column(GTK_TREE_VIEW(リスト)、列);

  ストア = gtk_list_store_new(N_COLUMNS、G_TYPE_STRING);

  gtk_tree_view_set_model(GTK_TREE_VIEW(リスト),
              GTK_TREE_MODEL(ストア));

  g_object_unref(ストア);
}

void add_to_list(GtkWidget *list, const gchar *str)
{

  GtkListStore * ストア;
  GtkTreeIter の反復;

  ストア = GTK_LIST_STORE(gtk_tree_view_get_model
              (GTK_TREE_VIEW(リスト)));

  gtk_list_store_append(ストア、&iter);
  gtk_list_store_set(ストア、&iter、LIST_ITEM、str、-1);
}


void on_changed(GtkWidget *ウィジェット、gpointer ラベル)
{

  GtkTreeIter の反復;
  GtkTreeModel *モデル;
  gchar *値;

  (gtk_tree_selection_get_selected()の場合
        GTK_TREE_SELECTION(ウィジェット、&モデル、&イター))
  {

    gtk_tree_model_get(モデル、&iter、LIST_ITEM、&値、-1);
    gtk_label_set_text(GTK_LABEL(ラベル), 値);
    g_free(値);
  }
}

int main(int argc, char *argv[])
{

  GtkWidget *ウィンドウ;
  GtkWidget *リスト;

  GtkWidget *vbox;
  GtkWidget *ラベル;
  GtkTreeSelection *選択;

  gtk_init(&argc, &argv);

  ウィンドウ = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  リスト = gtk_tree_view_new();

  gtk_window_set_title(GTK_WINDOW(window), "リストビュー");
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); //中央に設定します。
  gtk_container_set_border_width(GTK_CONTAINER(ウィンドウ), 10);
  gtk_widget_set_size_request(ウィンドウ、270、250);

  gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(リスト), FALSE);

  gtk_vbox_new は、新しいボックスを作成します。

  gtk_box_pack_start(GTK_BOX(vbox), リスト, TRUE, TRUE, 5);

  ラベル = gtk_label_new("");
  gtk_box_pack_start(GTK_BOX(vbox), ラベル, FALSE, FALSE, 5);

  gtk_container_add(GTK_CONTAINER(ウィンドウ)、vbox);

  init_list(リスト);
  add_to_list(リスト、「エイリアン」);
  add_to_list(リスト、"レオン");
  add_to_list(リスト、「評決」);
  add_to_list(リスト、"ノースフェイス");
  add_to_list(list, "Der Untergang");

  選択 = gtk_tree_view_get_selection(GTK_TREE_VIEW(リスト));

  g_signal_connect(選択、「変更」、
           G_CALLBACK(on_changed)、ラベル);

  g_signal_connect(G_OBJECT (ウィンドウ)、"destroy",
           G_CALLBACK(gtk_main_quit)、NULL;

  gtk_widget_show_all(ウィンドウ);

  gtk_main();

  0を返します。
}

上記のサンプル コードでは、5 つの項目を表示し、それらを GtkTreeView コンポーネントに配置します。まず、ウィンドウに GtkVBox ウィジェットを配置します。 この GtkVBox コンポーネントには、GtkTreeView と GtkLabel の 2 つのコンポーネントが含まれています。

リスト = gtk_tree_view_new();
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(リスト), FALSE);

コンポーネント リストを初期化するには、list() 関数を呼び出します。

レンダラー = gtk_cell_renderer_text_new();
 column = gtk_tree_view_column_new_with_attributes("リスト項目",
     レンダラー、「テキスト」、LIST_ITEM、NULL);
 gtk_tree_view_append_column(GTK_TREE_VIEW(リスト)、列);

初期化関数では、1 列のみの GtkTreeView を生成します。

ストア = gtk_list_store_new(N_COLUMNS、G_TYPE_STRING);
 gtk_tree_view_set_model(GTK_TREE_VIEW(リスト), 
   GTK_TREE_MODEL(ストア));

次に、GtkListStore ウィジェット (モデル) を作成し、リスト ウィジェットにバインドしました。

g_object_unref(ストア);

メモリ領域を解放するためにモデルは自動的に破棄されます。

add_to_list(リスト、「エイリアン」);

上記は、add_to_list() 関数を呼び出してリストにオプションを追加しています。

ストア = GTK_LIST_STORE(gtk_tree_view_get_model
(GTK_TREE_VIEW(リスト)));

gtk_list_store_append(ストア、&iter);
gtk_list_store_set(ストア、&iter、LIST_ITEM、str、-1);

関数 add_to_list() では、システム関数 gtk_tree_view_get_model() を使用してモデルを取得します。新しい行を生成し、その行のデータをモデルに渡して処理します。これは GtkTreeIter の助けを借りて実現されます。

選択 = gtk_tree_view_get_selection(GTK_TREE_VIEW(リスト));

GtkTreeSelection は実際には明示的に作成する必要はありません。ここでは、GtkTreeView コンポーネントを使用して自動的に生成します。ご覧のとおり、これを支援するのがシステム関数 gtk_tree_view_get_selection() です。

よし、もう少し練習してみよう。

列を追加する

コードは次のとおりです

#include <gtk/gtk.h>

列挙型
{
  リスト項目 = 0、
  リスト_年齢、
  N_列
};


void init_list(GtkWidget *リスト)
{
  //ビューにデータを表示するには、GtkCellRendererとGtkTreeViewColumnを作成する必要があります
  GtkCellRenderer *レンダラー;
  GtkTreeViewColumn *列;
  GtkListStore * ストア;
  
  //GtkCellRendererを作成する 
  レンダラー = gtk_cell_renderer_text_new();  
  //タイトル付きの列を作成し、コンテンツを表示できるようにレンダラーを配置します。column = gtk_tree_view_column_new_with_attributes("List Items", renderer, "text", LIST_ITEM, NULL);  
  //gtk_tree_viewに列を追加する
  gtk_tree_view_append_column(GTK_TREE_VIEW(リスト)、列);
  
  
  //GtkCellRendererを作成する 
  レンダラー = gtk_cell_renderer_text_new();  
  //g_object_set (G_OBJECT (renderer), "xalign", 1.0, NULL); //右揃え //タイトル付きの列を作成し、コンテンツを表示できるようにレンダラーを配置します。column = gtk_tree_view_column_new_with_attributes("List age", renderer, "text", LIST_AGE, NULL);  
  //gtk_tree_viewに列を追加する
  gtk_tree_view_append_column(GTK_TREE_VIEW(リスト)、列);
  
  

  ストア = gtk_list_store_new(N_COLUMNS、G_TYPE_STRING、G_TYPE_INT);
  
  
  //ビューとモデルを関連付ける gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store));

  // データ モデルを管理用のビューに送信します。ビューが破棄されると、データも一緒に破棄されます。g_object_unref(store);
}

void add_to_list(GtkWidget *list, const gchar *str,gint age) 関数は、リストにデータを追加します。
{

  GtkListStore * ストア;
  GtkTreeIter の反復;

  ストア = GTK_LIST_STORE(gtk_tree_view_get_model
              (GTK_TREE_VIEW(リスト)));

  gtk_list_store_append(ストア、&iter);
  gtk_list_store_set(ストア、&iter、LIST_ITEM、str、LIST_AGE、年齢、-1);
}



void on_changed(GtkWidget *ウィジェット、gpointer ラベル)
{

  GtkTreeIter の反復;
  GtkTreeModel *モデル;
  gchar *値;
  
  //ツリービューで選択された行の GtkTreeIter を取得します
  gtk_tree_selection_get_selected(GTK_TREE_SELECTION(ウィジェット), &model, &iter)の場合
  {

    gtk_tree_model_get(モデル、&iter、LIST_ITEM、&値、-1);
    gtk_label_set_text(GTK_LABEL(ラベル), 値);
    g_free(値);
  }
}

int main(int argc, char *argv[])
{

  GtkWidget *ウィンドウ;
  GtkWidget *リスト;

  GtkWidget *vbox;
  GtkWidget *ラベル;
  GtkTreeSelection *選択;

  gtk_init(&argc, &argv);

  ウィンドウ = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  リスト = gtk_tree_view_new();

  gtk_window_set_title(GTK_WINDOW(window), "リストビュー");
  gtk_window_set_position(GTK_WINDOW(ウィンドウ), GTK_WIN_POS_CENTER);
  gtk_container_set_border_width(GTK_CONTAINER(ウィンドウ), 10);
  gtk_widget_set_size_request(ウィンドウ、270、250);

  //タイトルの表示状態を設定します。
  gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(リスト), TRUE);

  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); //gtk_vbox_new (FALSE, 0);

  gtk_box_pack_start(GTK_BOX(vbox), リスト, TRUE, TRUE, 5);

  ラベル = gtk_label_new("");
  gtk_box_pack_start(GTK_BOX(vbox), ラベル, FALSE, FALSE, 5);

  gtk_container_add(GTK_CONTAINER(ウィンドウ)、vbox);

  init_list(リスト);
  add_to_list(リスト、"エイリアン"、10);
  add_to_list(リスト、"レオン"、2);
  add_to_list(リスト、「評決」、30);
  add_to_list(リスト、"ノースフェイス"、4);
  add_to_list(list, "Der Untergang",50);

  
  選択 = gtk_tree_view_get_selection(GTK_TREE_VIEW(リスト));

  g_signal_connect(選択、「変更」、
           G_CALLBACK(on_changed)、ラベル);

  g_signal_connect(G_OBJECT (ウィンドウ)、"destroy",
           G_CALLBACK(gtk_main_quit)、NULL;

  gtk_widget_show_all(ウィンドウ);

  gtk_main();

  0を返します。
}

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Android TreeViewはチェックボックスを備えたツリーのような組織構造を実装します
  • Pythonフォーム(tkinter)ツリーデータ(Treeview)の詳しい説明
  • チェックボックスとカスケード選択機能を備えた Bootstrap ツリービュー ツリー メニュー
  • QQ 連絡先リスト効果を実現するための WPF カスタム TreeView コントロール スタイル
  • Bootstrap ツリービューはデータを動的に読み込み、クイック検索機能を追加します
  • Android UI: 複数レベルのツリーリスト TreeView の例を実装する
  • JS ツリー メニュー コンポーネント Bootstrap TreeView の使い方の詳細な説明
  • Bootstrap ツリーメニュープラグイン TreeView.js の使い方の詳しい説明
  • BootStrap Treeviewの簡単な使用法の簡単な分析

<<:  Vue で className として空の文字列を使用することはなぜ推奨されないのですか?

>>:  MySQL で null 値と空文字 ('') を区別する

推薦する

Webデザインと制作のテスト問題と参考回答

<br />Web デザインと制作テスト パート I 多肢選択問題 1. 単一選択問題 ...

IntelliJ IDEA に Docker プラグインをインストールする詳細な手順 (2018 バージョン)

目次1. 開発環境2. dockerプラグインをインストールする1. アイデアのインストール2. イ...

Nginx での SSL 証明書のインストールと展開手順の概要

目次問題の説明:インストール手順1. 準備2. サーバーにリモート接続する3. 証明書と秘密鍵ファイ...

React Nativeプロジェクトフレームワークの構築経験

React Native は、2015 年 4 月に Facebook によってオープンソース化され...

CSS で子 div の高さを親コンテナの残りのスペースに合わせる方法

1. フローティング方式を使用する効果画像: コードは次のとおりです: (.content の高さは...

VirtualBox Centos7 の NAT+ホストオンリーネットワークの落とし穴のまとめ

目次1. 問題の背景2. 仮想マシン ネットワーク カードの接続方法は何ですか? 2.1 NAT 2...

円形/扇形メニューを2分で実装する方法を教えます(基本バージョン)

序文このプロジェクトでは円形のメニューが必要です。オンラインで検索しましたが、適切なものが見つからな...

Web ページのスクロール バーが右側に設定されているのはなぜですか?

私たちが毎日使っているブラウザや Word 文書のスクロール バーはなぜ右側にあるのでしょうか。多く...

複数のネットワークカードを備えた Linux システムでのルーティング構成の詳細な説明

Linux でのルーティング設定コマンド1. ホストルーティングを追加する ルートを追加 -host...

JavaScript が Jingdong の虫眼鏡効果を模倣

この記事では、Jingdongの虫眼鏡効果を実現するためのJavaScriptの具体的なコードを紹介...

ウェブフォーム送信方法の詳細な概要

まず、フォームを送信するいくつかの方法を見てみましょう。 1. <!--一般的な送信ボタン--...

Docker基盤技術の適用に関する詳細な説明 名前空間Cgroup

Docker の基盤技術: Docker の基盤となる 2 つのコア テクノロジーは、名前空間とコ...

JavaScriptで継承を実装するいくつかの方法

目次構造継承(callで実装)プロトタイプチェーン継承(プロトタイプチェーンの助けを借りて実装)複合...

Bootstrapグリッドの垂直および水平配置の詳細な説明

目次1. Bootstrap グリッドレイアウト2. 垂直方向の配置2.1 行タグの垂直方向の配置を...

Vue3ナビゲーションバーコンポーネントのカプセル化実装方法

参考までに、Vue3でナビゲーションバーコンポーネントをカプセル化し、スクロールバーのスクロールに合...