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 値と空文字 ('') を区別する
js コードをデバッグするには、コード内にデバッガーを記述するか、Chrome で毎回ブレークポイン...
Q: xml と html の違いがわかりません。違いは何ですか? A: XMLと HTML の違い...
1. 対象環境Windows 7 64ビット2. 材料(1)VC++2010リリースパッケージ(64...
純粋なフロントエンド実装:切片上傳斷點續傳。斷點續傳カットとアップロードに基づいて実装する必要があり...
nofollowをめぐる論争Zac と Guoping の間では、nofollow が PR を無駄...
展開環境:インストールバージョン Red Hat Cent 7.0 MYSQL バージョン 8.0....
Alibaba Cloud Server を使用している場合は、セキュリティ グループ設定でポート ...
序文explain コマンドは、クエリ オプティマイザーがクエリの実行を決定した方法を確認する主な方...
一部の Web ページは大きく見えなくても開くのに非常に時間がかかる場合があります。一方、他の We...
新しいプロジェクトでは、axios によって重複した送信を防ぐことができますが、古いプロジェクト (...
まず、ページにビデオを埋め込むための HTML コードは次のとおりです。コードをコピーコードは次のと...
この記事では、Harbor アーキテクチャの構成と、実行時に各コンポーネントを使用する方法について説...
Openlayers は、WebGIS クライアント向けのモジュール式で高性能かつ機能豊富な Jav...
この記事は、@C7210 によって翻訳されたブログ「Usability Counts」からの翻訳です...
この記事では、MySQL ユーザー権限管理の例について説明します。ご参考までに、詳細は以下の通りです...