Analyse des GTK-Treeview-Prinzips und der Verwendung

Analyse des GTK-Treeview-Prinzips und der Verwendung

Die GtkTreeView-Komponente ist eine erweiterte Komponente, mit der Sie schöne normale Listen oder baumartige Listen erstellen können. Diese Konstruktion kann eine oder mehrere Zeilen enthalten. Wie ist seine Struktur? Es übernimmt das bekannte MVC-Design-Framework (Model View Controller). Das heißt, die Daten und die Anzeigemethode sind getrennt.

Es gibt also tatsächlich mehrere andere unabhängige Objektstrukturen (Objekte) in der GtktreeView-Komponente.

GtkCellRenderer bestimmt, wie die Daten in GtkTreeViewColumn angezeigt werden.

Die Funktion von GtkListStore und GtkTreeStore besteht darin, die Rolle des Modells widerzuspiegeln.

Das heißt, sie werden zum Verarbeiten und Analysieren der im GtkTreeView anzuzeigenden Daten verwendet.

GtkTreeIter ist eine Datenstruktur, die zum Bearbeiten der Daten in der Zeile der GtkTreeView-Komponente verwendet wird.

GtkTreeSelection wird zum Verarbeiten von Optionen verwendet.

Die Wirkung ist wie folgt

Der Code lautet wie folgt

#include <gtk/gtk.h>

Aufzählung
{
  LIST_ITEM = 0,
  N_SPALTEN
};

void init_list(GtkWidget *list)
{

  GtkCellRenderer *Renderer;
  GtkTreeViewColumn *Spalte;
  GtkListStore *Speichern;

  Renderer = gtk_cell_renderer_text_new ();
  Spalte = gtk_tree_view_column_new_with_attributes("Listenelemente",
       Renderer, "Text", LIST_ITEM, NULL);
  gtk_tree_view_append_column(GTK_TREE_VIEW(Liste), Spalte);

  speichern = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING);

  gtk_tree_view_set_model(GTK_TREE_VIEW(Liste),
              GTK_TREE_MODEL(Speichern));

  g_object_unref(Speicher);
}

void zur Liste hinzufügen(GtkWidget *Liste, const gchar *str)
{

  GtkListStore *Speichern;
  GtkTreeIter iter;

  speichern = GTK_LIST_STORE(gtk_tree_view_get_model
              (GTK_TREE_VIEW(Liste)));

  gtk_list_store_append(speichern, &iter);
  gtk_list_store_set(store, &iter, LIST_ITEM, str, -1);
}


void on_changed(GtkWidget *widget, gpointer-Bezeichnung)
{

  GtkTreeIter iter;
  GtkTreeModel *Modell;
  gchar *Wert;

  wenn (gtk_tree_selection_get_selected(
        GTK_TREE_SELECTION(Widget), &Modell, &Iter))
  {

    gtk_tree_model_get(Modell, &iter, LIST_ITEM, &Wert, -1);
    gtk_label_set_text(GTK_LABEL(Bezeichnung), Wert);
    g_free(Wert);
  }
}

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

  GtkWidget *Fenster;
  GtkWidget *Liste;

  GtkWidget *vbox;
  GtkWidget *Bezeichnung;
  GtkTreeSelection *Auswahl;

  gtk_init(&argc, &argv);

  Fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  Liste = gtk_tree_view_new();

  gtk_window_set_title(GTK_WINDOW(window), "Listenansicht");
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); //Auf Mitte setzen.
  gtk_container_set_border_width(GTK_CONTAINER(Fenster), 10);
  gtk_widget_set_size_request(Fenster, 270, 250);

  gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(Liste), FALSE);

  vbox = gtk_vbox_new(FALSCH, 0);

  gtk_box_pack_start(GTK_BOX(vbox), Liste, WAHR, WAHR, 5);

  Bezeichnung = gtk_label_new("");
  gtk_box_pack_start(GTK_BOX(vbox), Bezeichnung, FALSCH, FALSCH, 5);

  gtk_container_add(GTK_CONTAINER(Fenster), vbox);

  init_list(Liste);
  zur Liste hinzufügen(Liste, "Aliens");
  zur Liste hinzufügen(Liste, "Leon");
  add_to_list(Liste, "Das Urteil");
  add_to_list(Liste, "Nordwand");
  add_to_list(list, "Der Untergang");

  Auswahl = gtk_tree_view_get_selection(GTK_TREE_VIEW(Liste));

  g_signal_connect(Auswahl, "geändert",
           G_CALLBACK(bei_geändert), Bezeichnung);

  g_signal_connect(G_OBJECT (Fenster), "zerstören",
           G_CALLBACK(gtk_main_quit), NULL);

  gtk_widget_show_all(Fenster);

  gtk_main();

  gebe 0 zurück;
}

Im obigen Beispielcode zeigen wir Ihnen 5 Elemente und ordnen sie in der Komponente GtkTreeView an. Wir platzieren zunächst ein GtkVBox-Widget im Fenster. Diese GtkVBox-Komponente enthält zwei Komponenten: GtkTreeView und GtkLabel.

Liste = gtk_tree_view_new();
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(Liste), FALSE);

Rufen Sie die Funktion list() auf, um die Komponentenliste zu initialisieren.

Renderer = gtk_cell_renderer_text_new();
 Spalte = gtk_tree_view_column_new_with_attributes("Listenelemente",
     Renderer, "Text", LIST_ITEM, NULL);
 gtk_tree_view_append_column(GTK_TREE_VIEW(Liste), Spalte);

In der Initialisierungsfunktion generieren wir eine GtkTreeView mit nur einer Spalte.

speichern = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING);
 gtk_tree_view_set_model(GTK_TREE_VIEW(Liste), 
   GTK_TREE_MODEL(Speichern));

Als nächstes haben wir ein GtkListStore-Widget (ein Modell) erstellt und es an das Listen-Widget gebunden.

g_object_unref(Speicher);

Das Modell wird automatisch zerstört, um Speicherplatz freizugeben.

zur Liste hinzufügen(Liste, "Aliens");

Oben wird die Funktion add_to_list() aufgerufen, um der Liste eine Option hinzuzufügen.

speichern = GTK_LIST_STORE(gtk_tree_view_get_model
(GTK_TREE_VIEW(Liste)));

gtk_list_store_append(speichern, &iter);
gtk_list_store_set(store, &iter, LIST_ITEM, str, -1);

In der Funktion add_to_list() verwenden wir die Systemfunktion gtk_tree_view_get_model(), um das Modell zu erhalten. Wir generieren eine neue Zeile und übergeben die Daten in der Zeile zur Verarbeitung an das Modell. Dies wird mit Hilfe von GtkTreeIter erreicht.

Auswahl = gtk_tree_view_get_selection(GTK_TREE_VIEW(Liste));

Eine GtkTreeSelection muss eigentlich nicht explizit erstellt werden. Hier verwenden wir die GtkTreeView-Komponente, um es automatisch zu generieren. Wie Sie sehen, hilft hierbei die Systemfunktion gtk_tree_view_get_selection().

Okay, übe noch ein bisschen.

Hinzufügen einer Spalte

Der Code lautet wie folgt

#include <gtk/gtk.h>

Aufzählung
{
  LIST_ITEM = 0,
  LIST_AGE,
  N_SPALTEN
};


void init_list(GtkWidget *list)
{
  //Um Daten in der Ansicht anzuzeigen, müssen Sie GtkCellRenderer und GtkTreeViewColumn erstellen
  GtkCellRenderer *Renderer;
  GtkTreeViewColumn *Spalte;
  GtkListStore *Speichern;
  
  //Erstellen Sie einen GtkCellRenderer 
  Renderer = gtk_cell_renderer_text_new ();  
  //Erstellen Sie eine Spalte mit einem Titel und fügen Sie einen Renderer ein, damit der Inhalt angezeigt werden kann. Spalte = gtk_tree_view_column_new_with_attributes("List Items", renderer, "text", LIST_ITEM, NULL);  
  //Spalten zu gtk_tree_view hinzufügen
  gtk_tree_view_append_column(GTK_TREE_VIEW(Liste), Spalte);
  
  
  //Erstellen Sie einen GtkCellRenderer 
  Renderer = gtk_cell_renderer_text_new ();  
  //g_object_set (G_OBJECT (Renderer), „xalign“, 1.0, NULL); //rechtsbündig //Erstelle eine Spalte mit einem Titel und füge den Renderer darin ein, damit er den Inhalt anzeigen kann. Spalte = gtk_tree_view_column_new_with_attributes(„Listenalter“, Renderer, „Text“, LIST_AGE, NULL);  
  //Spalten zu gtk_tree_view hinzufügen
  gtk_tree_view_append_column(GTK_TREE_VIEW(Liste), Spalte);
  
  

  speichern = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_INT);
  
  
  //Ansicht und Modell zuordnen gtk_tree_view_set_model(GTK_TREE_VIEW(Liste), GTK_TREE_MODEL(Speicher));

  //Senden Sie das Datenmodell zur Verwaltung an die Ansicht. Wenn die Ansicht zerstört wird, werden die Daten zusammen damit zerstört g_object_unref(store);
}

void add_to_list(GtkWidget *Liste, const gchar *str ,gint Alter)
{

  GtkListStore *Speichern;
  GtkTreeIter iter;

  speichern = GTK_LIST_STORE(gtk_tree_view_get_model
              (GTK_TREE_VIEW(Liste)));

  gtk_list_store_append(speichern, &iter);
  gtk_list_store_set(store, &iter, LIST_ITEM, str, LIST_AGE, Alter, -1);
}



void on_changed(GtkWidget *widget, gpointer-Bezeichnung)
{

  GtkTreeIter iter;
  GtkTreeModel *Modell;
  gchar *Wert;
  
  //Holen Sie sich den GtkTreeIter einer in der Baumansicht ausgewählten Zeile
  wenn (gtk_tree_selection_get_selected( GTK_TREE_SELECTION(Widget), &Modell, &Iter))
  {

    gtk_tree_model_get(Modell, &iter, LIST_ITEM, &Wert, -1);
    gtk_label_set_text(GTK_LABEL(Bezeichnung), Wert);
    g_free(Wert);
  }
}

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

  GtkWidget *Fenster;
  GtkWidget *Liste;

  GtkWidget *vbox;
  GtkWidget *Bezeichnung;
  GtkTreeSelection *Auswahl;

  gtk_init(&argc, &argv);

  Fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  Liste = gtk_tree_view_new();

  gtk_window_set_title(GTK_WINDOW(window), "Listenansicht");
  gtk_window_set_position(GTK_WINDOW(Fenster), GTK_WIN_POS_CENTER);
  gtk_container_set_border_width(GTK_CONTAINER(Fenster), 10);
  gtk_widget_set_size_request(Fenster, 270, 250);

  //Legen Sie den Sichtbarkeitsstatus des Titels fest.
  gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(Liste), TRUE );

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

  gtk_box_pack_start(GTK_BOX(vbox), Liste, WAHR, WAHR, 5);

  Bezeichnung = gtk_label_new("");
  gtk_box_pack_start(GTK_BOX(vbox), Bezeichnung, FALSCH, FALSCH, 5);

  gtk_container_add(GTK_CONTAINER(Fenster), vbox);

  init_list(Liste);
  zur Liste hinzufügen(Liste, "Aliens", 10);
  zur Liste hinzufügen(Liste, "Leon", 2);
  add_to_list(Liste, "Das Urteil", 30);
  add_to_list(Liste, "Nordwand", 4);
  add_to_list(list, "Der Untergang",50);

  
  Auswahl = gtk_tree_view_get_selection(GTK_TREE_VIEW(Liste));

  g_signal_connect(Auswahl, "geändert",
           G_CALLBACK(bei_geändert), Bezeichnung);

  g_signal_connect(G_OBJECT (Fenster), "zerstören",
           G_CALLBACK(gtk_main_quit), NULL);

  gtk_widget_show_all(Fenster);

  gtk_main();

  gebe 0 zurück;
}

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Android TreeView implementiert eine baumartige Organisationsstruktur mit Kontrollkästchen
  • Detaillierte Erklärung der Baumdaten (Treeview) in Python-Form (tkinter)
  • Bootstrap Treeview-Baummenü mit Kontrollkästchen und kaskadierender Auswahlfunktion
  • Benutzerdefinierter TreeView-Steuerungsstil von WPF zum Erzielen eines QQ-Kontaktlisteneffekts
  • Bootstrap-Treeview lädt Daten dynamisch und fügt eine Schnellsuchfunktion hinzu
  • Android UI: Implementierung eines mehrstufigen Baumlisten-TreeView-Beispiels
  • Detaillierte Erklärung zur Verwendung der JS-Baummenükomponente Bootstrap TreeView
  • Detaillierte Erklärung zur Verwendung des Bootstrap-Baummenü-Plugins TreeView.js
  • Eine kurze Analyse der einfachen Verwendung von BootStrap Treeview

<<:  Warum wird nicht empfohlen, in Vue eine leere Zeichenfolge als Klassennamen zu verwenden?

>>:  Unterscheiden Sie zwischen Nullwert und leerem Zeichen ('') in MySQL

Artikel empfehlen

Diskussion zum Problem der Initialisierung von Iframe-Knoten

Heute fiel mir plötzlich ein, die Produktionsprinz...

Detaillierte Erläuterung der Verwendung des Linux-Zeitbefehls

1. Befehlseinführung Mit „time“ werden die für di...

Detaillierte Erläuterung der 4 gängigen Datenquellen in Spark SQL

Allgemeine Lade-/Schreibmethoden Optionen manuell...

Beschreiben Sie kurz den Unterschied zwischen Redis und MySQL

Wir wissen, dass MySQL ein persistenter Speicher ...

Implementierung der Nginx-Lastverteilung/SSL-Konfiguration

Was ist Lastenausgleich? Wenn ein Domänenname auf...

Führen Sie die Schritte zur Verwendung des Elements in vue3.0 aus

Vorwort: Verwenden Sie das Element-Framework in v...

Mehrere Möglichkeiten zum Aktualisieren von Batches in MySQL

Normalerweise verwenden wir die folgende SQL-Anwe...

Detaillierte Erklärung der Schritte zum Erstellen eines Vue-Projekts mit Vue-cli

Zuerst müssen Sie Vue-cli installieren: npm insta...

Lösung für SQL Server-Datenbankfehler 5123

Weil ich ein Datenbank-Tutorial habe, das auf SQL...