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 つのコンポーネントが含まれています。
コンポーネント リストを初期化するには、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() 関数を呼び出してリストにオプションを追加しています。
関数 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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Vue で className として空の文字列を使用することはなぜ推奨されないのですか?
>>: MySQL で null 値と空文字 ('') を区別する
適切なデータベース仕様は、ソフトウェア実装の複雑さを軽減し、通信コストを削減するのに役立ちます。この...
目次バックエンド: Rails API部分フロントエンド: React部分Reactコンポーネントa...
サーバーデータがSSL証明書を使用して暗号化および認証されていない場合、ユーザーのデータはプレーンテ...
目次1. beforeunload イベント2. アンロードイベント3. ソースコードプロジェクトの...
について最近、Vue を学習する過程で、基本的な知識の練習と強化を目的として、Qunar.com の...
Google Reader で、JunChen が書いた「フロー理論と設計」というタイトルの投稿を見...
文字列を置き換えるには、次の形式を使用する必要があります。 $ sed s/置換対象文字列/置換文字...
目次序文React Context の初見コンテキストの使い方コンテキストを直接取得できるいくつかの...
I. はじめに1: SSL証明書私のドメイン名は Tencent Cloud にあります。第 3 レ...
問題を見つける今日、Docker コンテナ内のファイルを変更しようとしたところ、コンテナ内に vim...
この記事では、水平棒グラフを実現するためのvue echartsの具体的なコードを参考までに共有しま...
接続は、実際の外部キー(人工的に作成された 2 つのテーブル間の対応関係を指します。対照的に、FOR...
Linux でディレクトリを切り替えるとなると、誰もが間違いなくcdコマンドを思い浮かべるでしょう。...
この記事では、例を使用して MySQL コード実行構造について説明します。ご参考までに、詳細は以下の...
<base target=_blank> は、基本リンクのターゲット フレームを新しいペ...