2009-05-08 6 views
0

Ich habe im gtk Quellcode geschaut und die Headerhöhe ist privat. Ich habe etwas versucht, aber es hat nicht wie gewünscht arbeiten (die heightWithHeader 1 ist ?!)Wie bekomme ich die Höhe des gtktreewiew Headers?

Glib::RefPtr<Gdk::Window> pWindow = treeView.get_bin_window(); 

treeView.set_headers_visible(true); 
pWindow->get_size(width, heightWithHeader); 

treeView.set_headers_visible(false); 

pWindow->get_size(width, heightWithoutHeader); 

r_treeView.set_headers_visible(true); 

returnValue = heightWithHeader - heightWithoutHeader; 

Können Sie mir helfen mit einer anderen Lösung oder ein Update zu meinem Code?

Update: Ich muss die Höhe der Baumansicht anpassen, um eine feste Anzahl von Zeilen anzuzeigen. Dazu ändere ich die Größe des Containers (ein Bildlauffenster) in headerHeight + numberRowsToDisplay * heightOfRow.

Antwort

0

Der Grund, warum Ihr Code nicht funktioniert, ist sehr wahrscheinlich, dass Sie "zu ungeduldig" sind und GTK + nicht Zeit geben, die Widgets neu zu zeichnen, bevor Sie die Header wieder unsichtbar machen.

GTK + zeichnet nicht sofort, wenn Sie einen Anruf ausführen, der ein Neuzeichnen erfordert. Stattdessen werden Redraws in die Warteschlange gestellt und dann alle gleichzeitig aus der GTK + Hauptschleife ausgeführt. Auf diese Weise führt das wiederholte Ausführen von zwei Änderungen an Widgets nicht zu zwei Neuzeichnungen, sondern nur zu einem.

es ein bisschen wie ein Hack ist, aber man kann den „klassischen“ GTK + event Spülung Trick versuchen, durch eine Schleife wie diese eingefügt, nachdem Sie auf dem Header drehen:

while(gtk_events_pending()) 
    gtk_main_iteration(); 

Dies einfach für so Schleifen Solange es Ereignisse in der Warteschlange von GTK + gibt (die oben genannten Zeichenänderungen sind Ereignisse intern), werden sie gelöscht und geben Ihnen die Kontrolle zurück. Dies wird jedoch sehr wahrscheinlich zu einem visuellen Flimmern führen.

+0

Ich muss die Höhe der Baumansicht anpassen, um eine feste Anzahl von Zeilen anzuzeigen. Dazu ändere ich die Größe des Containers (ein Bildlauffenster) in headerHeight + numberRowsToDisplay * heightOfRow. –