[GTK+]Zeilenauswahl in Tree View - gtk_tree_view_get_selection verhält sich komisch , funktioniert nicht



  • Hallo
    Habe hier ein GUI mit einer Liste- > die Struktur zum Anzeigen der Daten ist ein Tree View. Bild von GUI

    Durch klicken mit der Maus oder mit den Pfeiltaste kann ich die Auswahl(die aktuelle Zeile) ändern.
    Ich will jetzt einfach aus der aktuellen Zeile,die die gerade angewählt ist, den String zurücklesen,damit ich einen Teil daraus verwenden kann um die Textboxen am rechten Rand zu füllen.
    So das wäre mal das Ziel.

    Bei der Suche nach einer Lösung für das Problem bin ich auf gtk_tree_view_get_selection gestossen das bei Änderung (select / unselect) der aktuellen ROW eine Funktion aufruft.

    Dabei treten aber leider zwei Problem auf.
    1stens: die Funktion view_selection_func wird immer dreimal aufgerufen,außer beim ersten mal nur einmal, ist das so gewollt??

    2tens: zu Testzwecken habe ich mir iter zweimal ausgeben lassen damit ich sehe wo der Cursor gerade steht, da ich dauernd Seg Faults bekommen habe. Aus irgendwelchem Grund passt der iter nach der Funktion gtk_tree_selection_iter_is_selected nicht (mit der funktion gtk_tree_model_get verhält es sich genauso) - verstehe aber nicht warum. Würde ich mit dem diesem iter weiter arbeiten würde ich eine Seg Fault bekommen da diese Zahl nicht innerhalb der liste liegt.

    Ausgabe des Iter Wertes:
    Klickreihenfolge: Nach dem Start habe ich zu aller erst habe ich auf die Zeile 0 geklickt was folgendes zurücklieferte.

    Selected_vorher: 0
    

    Dann habe ich Zeile 1 angewählt->Resultat war:

    Selected_vorher: 1
    Selected_vorher: 0
    Selected 8611376
    Selected_vorher: 1
    

    Dann habe ich Zeile 2 angewählt->Resultat war:

    Selected_vorher: 2
    Selected_vorher: 1
    Selected 8610608
    Selected_vorher: 2
    

    Dann habe ich Zeile 7 angewählt->Resultat war:

    Selected_vorher: 7
    Selected_vorher: 2
    Selected 8599072
    Selected_vorher: 7
    

    Dann habe ich Zeile 4 angewählt->Resultat war:

    Selected_vorher: 3
    Selected_vorher: 7
    Selected 8614112
    Selected_vorher: 3
    

    Hier ist der Code (relevanter Auszug) mit dem das ganze (Bild und Ausgabe) erstellt wurde.

    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
        gtk_tree_selection_set_mode(selection,GTK_SELECTION_SINGLE);
        gtk_tree_selection_set_select_function(selection, view_selection_func, NULL, NULL);
    
    gboolean
      view_selection_func (GtkTreeSelection *selection,
                           GtkTreeModel     *model,
                           GtkTreePath      *path,
                           gboolean          path_currently_selected,
                           gpointer          userdata)
      {
        GtkTreeIter iter;
    
        if (gtk_tree_model_get_iter(model, &iter, path))
       { g_print("Selected_vorher: %d\n",iter);
    
           if(gtk_tree_selection_iter_is_selected(selection,&iter))
           {g_print("Selected %d\n",iter);}
       }
    
        return TRUE; /* allow selection state to change */
      }
    

    C Code habe ich mir von hier abgeschaut:
    http://scentric.net/tutorial/sec-sel-click-menus.html -> so wie es hier steht bekomme ich es überhaupt nicht zum laufen da der iter Wert ja falsch ist, wie man ja leicht mithilfe meines modifizierten Programms sieht. 😞



  • THE_ONE schrieb:

    so wie es hier steht bekomme ich es überhaupt nicht zum laufen da der iter Wert ja falsch ist, wie man ja leicht mithilfe meines modifizierten Programms sieht. 😞

    Wieso sollte der iter falsch sein? was passiert denn wenn du folgendes einbaust:

    GtkTreeSelection *selection;
      GtkTreeModel     *model;
      GtkTreeIter       iter;
    
      /* This will only work in single or browse selection mode! */
    
      selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
      if (gtk_tree_selection_get_selected(selection, &model, &iter))
      {
        gchar *name;
    
        gtk_tree_model_get (model, &iter, COL_NAME, &name, -1);
    
        g_print ("selected row is: %s\n", name);
    
        g_free(name);
      }
      else
      {
        g_print ("no row selected.\n");
      }
    


  • joomoo schrieb:

    [cpp] GtkTreeSelection *selection;
    GtkTreeModel *model;
    GtkTreeIter iter;

    /* This will only work in single or browse selection mode! */

    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
    if (gtk_tree_selection_get_selected(selection, &model, &iter))
    {
    gchar *name;

    gtk_tree_model_get (model, &iter, COL_NAME, &name, -1);

    g_print ("selected row is: %s\n", name);

    g_free(name);
    }
    else
    {
    g_print ("no row selected.\n");
    }[/cpp]

    Was muss ich denn bei COL_NAME angeben ?



  • ich glaube die nummer der spalte. Ich hab's hier her: http://scentric.net/tutorial/sec-sel-click-menus.html



  • ich hab mich an dem Beispiel versucht -> http://scentric.net/tutorial/sec-selections-double-click.html

    void
      view_onRowActivated (GtkTreeView        *treeview,
                           GtkTreePath        *path,
                           GtkTreeViewColumn  *col,
                           gpointer            userdata)
      {
        GtkTreeModel *model;
        GtkTreeIter   iter;
    
        g_print ("A row has been double-clicked!\n");
    
        model = gtk_tree_view_get_model(treeview);
    
        if (gtk_tree_model_get_iter(model, &iter, path))
        {
           gchar *name;
    
           gtk_tree_model_get(model, &iter, COLUMN_NAME, &name, -1);
    
           g_print ("Double-clicked row contains name %s\n", name);
    
           g_free(name);
        }
      }
    

    COLUMN_NAME ist nicht definiert, klar aber wenn ich 0 oder 1 einsetze bekomme ich nur einen Segmentation fault 😞 Selbst wenn ich eine GtkTreeViewColumn übergebe .. Noch jemand ne Idee?



  • jetzt gehts plötzlich doch, man kann direkt die spalte angeben 😉



  • hallo,

    ich brauche nochmal Hilfe .. mit dem oben angegebenen Quellcode bekomme ich zwar wunderbar den Text aus dem Tree aber nicht die Zeilennummer. Wie komme ich nun an die selektierte Zeilen Nummer?

    Danke schonmal 😉


Anmelden zum Antworten