[gtkmm] TreeView - bestimmte Zellen nicht anzeigen und ein Bug mit resizeable?



  • Hallo,

    hab da ein kleines Problem - und zwar soll in einem TreeView in einer Spalte nur in bestimmten Zeilen eine Checkbox angezeigt werden - in allen anderen aber nicht.

    So sieht es momentan aus:
    img=http://img260.imageshack.us/img260/197/treeview1ss2.th.png

    Die Checkboxen die eigentlich NICHT angezeigt werden sollen habe ich hier Rot durchgestrichen.

    Tja - einfache Frage: Wie könnte ich das realisieren? 🙂
    Gibt es irgendwo ein Beispiel zu sowas?
    Irgendwas, was abhängig von einer Bedingung den Inhalt einer Zelle verändert würde mir ja schon reichen.
    Ich vermute mal ich muss einen eigenen CellRenderer implementieren - aber ich habe kein gescheites Beispiel dazu gefunden bisher.

    Das hier:
    http://gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/sec-treeview.html

    kenne ich schon - bekomme ich aber damit partout nicht hin.
    Bin aber auch erst seit kurzem mit GTKmm dran und meist arbeite ich auf PC Plattformen nur mit Java (wo das recht einfach wäre 😉 ).

    Danke schonmal!

    MfG,
    SlyD

    PS:

    Bug oder nicht?

    Gtk::TreeViewColumn* col = this->get_column(0);
        if(col) {
    
            // In der GTKmm Doku gibt es eine Methode*  "set_resizeable(bool)" für TreeViewColumn,
            // aber die ist gar nicht implementiert?!
            // (GTKmm 2.4)
    
            // Also:
            // col->set_resizeable(true);
            // klappt nicht, da es diese Methode anscheinend gar nicht gibt.
            // (auch nicht im entsprechenden Header drin - hab nachgeschaut)
    
            // Es gibt auch keine Property dafür-
            // Workaround: die C Funktion von GTK+ verwenden  ;) 
            gtk_tree_view_column_set_resizable(col->gobj(), true);
    
        }
    

    * http://gtkmm.org/docs/gtkmm-2.4/docs/reference/html/classGtk_1_1TreeViewColumn.html#c16b622dad072f0a1a88e13d11be94aa



  • slyd schrieb:

    Tja - einfache Frage: Wie könnte ich das realisieren? 🙂
    Gibt es irgendwo ein Beispiel zu sowas?
    Irgendwas, was abhängig von einer Bedingung den Inhalt einer Zelle verändert würde mir ja schon reichen.
    Ich vermute mal ich muss einen eigenen CellRenderer implementieren - aber ich habe kein gescheites Beispiel dazu gefunden bisher.

    Hier habe ich gezeigt, wie man einen eigenen CellRenderer anwendet. Ob du damit allerdings dein Problem lösen kannst weiß ich nicht.

    Bug oder nicht?

    Kompiliert bei mir sauber durch. Muss ein Fehler bei dir sein.

    Cheers

    GPC



  • Hallo,

    genau das gleiche Problem hatte ich auch.

    (siehe Forumsbeitrag: http://www.c-plusplus.net/forum/viewtopic-var-p-is-1402439.html)

    Letztlich geht es genau wie dort beschrieben, mit Cellrenderern, das sieht dann so aus:

    In der Header-Datei:

    Gtk::CellRendererText m_CellR_rows;
    

    Im Konstruktor:

    ...
        cols_count = m_TreeView.append_column("Datens\xC3\xA4tze", m_CellR_rows);
        pColumn = m_TreeView.get_column(cols_count - 1);
        if(pColumn)
        {
            pColumn->set_cell_data_func(m_CellR_rows, sigc::mem_fun(*this,
                &WindowMain::on_cellData_rows) );
        pColumn = NULL;
        }
    ...
    

    Umsetzung:

    void WindowMain::on_cellData_rows(Gtk::CellRenderer *renderer, const Gtk::TreeModel::iterator &iter)
    {
    	Glib::ustring view_text;
    	if(iter)
    	{
    		Gtk::TreeModel::Row row = *iter;
    		if( row[m_PMyColumnRecord->m_hidden_isFile] )
    		{
    			double model_value = row[m_PMyColumnRecord->m_numRows];
    			std::ostringstream buffer;
    			buffer << model_value;
    			view_text = buffer.str();
    		}
    #ifdef GLIBMM_PROPERTIES_ENABLED
    		m_CellR_rows.property_text() = view_text;
    #else
    		m_CellR_rows.set_property("text", view_text);
    #endif
    	}
    }
    


  • @namtel:
    vielen Dank!
    Das klappt wunderbar und ist genau das was ich gesucht habe!
    🙂

    @GPC:

    Kompiliert bei mir sauber durch. Muss ein Fehler bei dir sein.

    Klar möglich ist das, aber Du hast auch die eine Zeile da un-kommentiert?

    Also die hier meine ich:
    // col->set_resizeable(true);
    Da die Kommentarzeichen entfernen - das ist ja die Funktion die er bei mir nicht findet (weswegen es ja auskommentiert ist 😉 ).

    Ich nutze Ubuntu 7.10 und hab die GTKmm Libs vor kurzem einfach per Synaptic installiert. Der Rest funktioniert auch problemlos - nur diese eine Funktion scheint er nicht zu finden...

    MfG,
    SlyD



  • SlyD schrieb:

    @GPC:

    Kompiliert bei mir sauber durch. Muss ein Fehler bei dir sein.

    Klar möglich ist das, aber Du hast auch die eine Zeile da un-kommentiert?

    Ich hab' ein eigenes Beispiel durchgejagt und die war da nicht auskommentiert 🙂

    Ich nutze Ubuntu 7.10 und hab die GTKmm Libs vor kurzem einfach per Synaptic installiert. Der Rest funktioniert auch problemlos - nur diese eine Funktion scheint er nicht zu finden...

    hm, hab debian 4 mit testing repository... ist eigentlich alles auf dem aktuellsten Stand.


Anmelden zum Antworten