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

So fügen Sie Docker dynamisch Ports hinzu, ohne das Image neu zu erstellen

Manchmal müssen Sie während des Betriebs freigege...

Detaillierte Analyse des Blockierungsproblems von js und css

Inhaltsverzeichnis DOMContentLoaded und laden Was...

Mit CSS3 wird ein Kegelschnitt-Gradienteneffekt erzielt

Grammatik: Hintergrundbild: Kegelschnitt-Farbverl...

MySQL 8.X Installations-Tutorial unter Windows

Zuvor habe ich MySQL 5.7 verwendet, aber da MySQL...

Detaillierte Erklärung des MySQL-Prepare-Prinzips

Vorteile von Prepare Der Grund, warum Prepare SQL...

Natives JS realisiert zusammengesetzte Bewegungen verschiedener Bewegungen

In diesem Artikel erfahren Sie mehr über eine zus...

9 superpraktische CSS-Tipps, die Designern und Entwicklern helfen

Im Kopf eines Webdesigners muss viel Wissen im Zus...

Detailliertes Tutorial zum Herunterladen und Installieren von mysql8.0.21

Offizielle Website-Adresse: https://www.mysql.com...

Auszeichnungssprache - Bildersetzung

Klicken Sie hier, um zum Abschnitt „HTML-Tutorial“...

Detaillierte Erläuterung der Wissenspunkte der Linux-DMA-Schnittstelle

1. Zwei Arten der DMA-Zuordnung 1.1. Konsistente ...

Tutorial zur Master-Slave-Konfiguration der MySQL-Datenbank unter Windows

Der detaillierte Prozess zum Konfigurieren des My...