Question

J'ai examiné le code source de gtk et la hauteur de l'en-tête est privée. J'ai essayé quelque chose mais cela n'a pas fonctionné comme souhaité (le heightWithHeader vaut 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;

Pouvez-vous m'aider avec une autre solution ou une solution à mon code?

Mise à jour: je dois ajuster la hauteur de l'arborescence pour afficher un nombre fixe de lignes. Pour ce faire, je règle la taille du conteneur (une fenêtre à défilement) sur headerHeight + numberRowsToDisplay * heightOfRow.

Était-ce utile?

La solution

La raison pour laquelle votre code ne fonctionne pas, c'est très probablement que vous êtes "trop ??impatient", ne donnez pas à GTK + le temps de redessiner les widgets avant de rendre les en-têtes invisibles.

GTK + ne dessine pas immédiatement lorsque vous effectuez un appel nécessitant un rafraîchissement. Au lieu de cela, les mises à jour sont mises en file d'attente, puis toutes en même temps à partir de la boucle principale GTK +. De cette façon, deux modifications séquentielles des widgets ne provoquent pas deux retraits, mais un seul.

C'est un peu un bidouillage, mais vous pouvez essayer le "classique" Astuce de vidage d'événement GTK +, en insérant une boucle comme celle-ci après avoir activé les en-têtes:

while(gtk_events_pending())
  gtk_main_iteration();

Ceci est simplement bouclé tant qu'il y a des événements dans la file d'attente de GTK + (les modifications de tirage mentionnées ci-dessus sont des événements, en interne), puis les efface, puis vous redonne le contrôle. Cela entraînera très probablement un scintillement visuel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top