Wie die Höhe des GtkTreeView Header zu bekommen?
-
22-07-2019 - |
Frage
Ich habe in der gtk Quellcode geschaut und die Kopfhöhe ist privat. Ich habe versucht, etwas, aber es hat nicht funktioniert als wollte (der heightWithHeader 1?!)
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 mit einer anderen Lösung helfen oder ein Update zu meinem Code?
Update: Ich habe die Höhe der Baumansicht einzustellen, um eine feste Anzahl von Zeilen angezeigt werden soll. Ich tue dies, indem die Größe des Behälters einzustellen (a scrolledwindow) zu header + numberRowsToDisplay * heightOfRow.
Lösung
Der Grund, Ihr Code nicht funktioniert, ist sehr wahrscheinlich, dass Sie „zu ungeduldig“ sind zu sein, nicht GTK + geben Zeit, um den Neuaufbau der Widgets zu tun, bevor Sie die Header unsichtbar machen wieder.
GTK + nicht sofort ziehen, wenn Sie einen Anruf zu tun, die einen Neuaufbau erfordert. Stattdessen werden redraws Warteschlange, und dann auf einmal getan von der GTK + Hauptschleife. Auf diese Weise macht zwei Änderungen an Widgets in Folge verursacht keine zwei redraws, aber nur eine.
Es ist ein bisschen wie ein Hack, 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();
Diese Schleifen einfach, solange gibt es Veranstaltungen in GTK + 's-Warteschlange (die Auslosung Änderungen oben genannten Ereignisse, intern), und spült sie dann die Kontrolle an Dich zurück gibt. Dies wird sehr wahrscheinlich in einigen visuellen Flimmern führen, though.