Come ottenere l'altezza dell'intestazione gtktreeview?
-
22-07-2019 - |
Domanda
Ho cercato nel codice sorgente gtk e l'altezza dell'intestazione è privata. Ho provato qualcosa ma non ha funzionato come desiderato (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;
Potete aiutarmi con un'altra soluzione o una correzione del mio codice?
Aggiornamento: devo regolare l'altezza della treeview per visualizzare un numero fisso di righe. Lo faccio regolando le dimensioni del contenitore (una finestra a scorrimento) su headerHeight + numberRowsToDisplay * heightOfRow.
Soluzione
Il motivo per cui il tuo codice non funziona è molto probabile che tu sia "troppo impaziente", non dai a GTK + il tempo di fare il ridisegno dei widget prima di rendere nuovamente invisibili le intestazioni.
GTK + non disegna immediatamente quando si effettua una chiamata che richiede un ridisegno. Invece i ridisegni vengono messi in coda e quindi eseguiti tutti in una volta dal ciclo principale GTK +. In questo modo, fare due modifiche ai widget in sequenza non provoca due ridisegni, ma solo uno.
È un po 'un trucco, ma potresti provare il "classico" GTK + trucco di flushing di eventi, inserendo un loop come questo dopo aver attivato le intestazioni:
while(gtk_events_pending())
gtk_main_iteration();
Questo semplicemente scorre fino a quando ci sono eventi nella coda di GTK + (le modifiche al sorteggio menzionate sopra sono eventi, internamente) e li svuota, quindi ti restituisce il controllo. Ciò molto probabilmente comporterà comunque uno sfarfallio visivo.