Es geht um folgenden Code:
#include <gtk/gtk.h>
#include <string.h>
// Globale Variablen für die UI-Elemente
GtkWidget *search_entry;
GtkWidget *treeview;
GtkListStore *list_store;
GtkTreeModel *filter_model;
// Beispiel-Lagerbestand
typedef struct {
const gchar *artikelnummer;
const gchar *name;
int bestand;
} Lagerartikel;
// Beispielhafte Lagerartikel
Lagerartikel lager[] = {
{"1001", "Laptop", 15},
{"1002", "Maus", 50},
{"1003", "Tastatur", 30},
{"1004", "Monitor", 10},
{"1005", "Drucker", 5},
{"1006", "USB-Stick", 100}
};
const int lager_size = sizeof(lager) / sizeof(lager[0]);
// Filterfunktion für die Suche
static gboolean filter_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer data) {
gchar *artikelnummer = NULL;
gtk_tree_model_get(model, iter, 0, &artikelnummer, -1);
if (artikelnummer == NULL) {
return TRUE;
}
GtkWidget *search_entry = GTK_WIDGET(data);
const gchar *search_text = gtk_entry_get_text(GTK_ENTRY(search_entry));
if (search_text == NULL) {
search_text = "";
}
gboolean visible = TRUE;
if (strlen(search_text) > 0) {
visible = g_strrstr(artikelnummer, search_text) != NULL;
}
g_free(artikelnummer);
return visible;
}
// Aktualisiert den Filter, wenn sich der Suchtext ändert
static void on_search_changed(GtkSearchEntry *entry, gpointer user_data) {
gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(filter_model));
}
// Erstellt die Lagerbestand-Tabelle
static void setup_treeview(GtkBuilder *builder) {
treeview = GTK_WIDGET(gtk_builder_get_object(builder, "treeview"));
// Spalten für die TreeView erstellen
GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
GtkTreeViewColumn *col1 = gtk_tree_view_column_new_with_attributes("Artikelnummer", renderer, "text", 0, NULL);
GtkTreeViewColumn *col2 = gtk_tree_view_column_new_with_attributes("Name", renderer, "text", 1, NULL);
GtkTreeViewColumn *col3 = gtk_tree_view_column_new_with_attributes("Bestand", renderer, "text", 2, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), col1);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), col2);
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), col3);
// ListStore erstellen und Daten füllen
list_store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT);
for (int i = 0; i < lager_size; i++) {
GtkTreeIter iter;
gtk_list_store_append(list_store, &iter);
gtk_list_store_set(list_store, &iter, 0, lager[i].artikelnummer, 1, lager[i].name, 2, lager[i].bestand, -1);
}
// Filtermodell erstellen
filter_model = gtk_tree_model_filter_new(GTK_TREE_MODEL(list_store), NULL);
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(filter_model), filter_func, search_entry, NULL);
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), filter_model);
}
// Hauptfunktion
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
// Glade-Datei laden
GtkBuilder *builder = gtk_builder_new_from_file("part1.glade");
// Widgets abrufen
GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "main_window"));
search_entry = GTK_WIDGET(gtk_builder_get_object(builder, "search_entry"));
// Signal für die Suche
g_signal_connect(search_entry, "search-changed", G_CALLBACK(on_search_changed), search_entry);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
// Setup für die TreeView
setup_treeview(builder);
// Fenster anzeigen
gtk_widget_show_all(window);
gtk_main();
return 0;
}
Ich benutze Glade um mit c ein interface zu erstelle.
Hier sollen die definierten Lagerartikel nach den Artikelnummern gesucht werden. Wenn man etwa 1002 eingibt bleibt nur 1002 übrig. wenn ich jetzt aber die 2 wegnehme, bleibt nur 1002 und 1003 übrig, obwohl alle angezeigt werden sollten.
Jetzt ist meine Frage, wie ich das beheben kann.
Auch ist folgendes: Bei 1003 zu 100 kommt 1003, 1004, 1005. Bei 1004 zu 100 kommt 1004, 1005, 1006, genau das gleiche bei 1005 und 1006. Nur bei 1001 zu 100 kommt alles