La documentation de void QAbstractScrollArea::setViewportMargins(int left, int top, int right, int bottom) dit :
Définit les marges autour de la zone de défilement à gauche, en haut, à droite et en bas. Ceci est utile pour les applications telles que les feuilles de calcul avec des lignes et des colonnes "verrouillées". L'espace marginal est laissé vide ; placez des widgets dans la zone inutilisée. Notez que cette fonction est fréquemment appelée par QTreeView et QTableView, les marges doivent donc être implémentées par les sous-classes de QAbstractScrollArea. De même, si les sous-classes doivent être utilisées dans des vues d'éléments, elles ne doivent pas appeler cette fonction.
Tout d'abord, j'ai été confondu avec la description elle-même. La fonction n'est pas virtuelle, ce n'est donc pas le cas lorsque je dois la réimplémenter pour fournir mes marges. Si je dois l'appeler, alors quand, à quel moment ? Et si QTreeView l'appelle en interne avec ses propres valeurs, comment nos appels vont-ils coopérer ? En regardant les sources de Qt, j'ai trouvé que QTreeView::updateGeometries() l'appelle avec des paramètres (essentiellement) 0, headerHeight, 0, 0. Donc, dois-je réimplémenter updateGeometries() ?
En cherchant plus loin sur Google, j'ai trouvé que d'autres personnes appellent setViewportMargins() à partir d'un resizeEvent() surchargé. J'ai donc fait de même et cela fonctionne MAIS :
- Je me demande comment cette technique peut coexister avec la méthode interne QTreeView::updateGeometries() qui appelle setViewportMargins() avec des paramètres essentiellement codés en dur (seule la hauteur de l'en-tête est changée en 0 si l'en-tête est caché) ?
- Bien que cela fonctionne, la "zone inutilisée" apparaît au-dessus de l'en-tête. Mais pour mettre en œuvre les rangées "verrouillées" mentionnées dans la documentation, il faut que cette zone se trouve sous l'en-tête.
J'ai obtenu une zone inutilisée sous l'en-tête en surchargeant updateGeometries() et en déplaçant header() vers le haut (après avoir appelé QTreeView::updateGeometries() ;). Mais je ne suis pas sûr que ce soit la bonne chose à faire.
Donc ma question est : Quelle est la façon d'implémenter les rangées "verrouillées" dont parle la documentation de setViewportMargins() et comment les implémenter réellement ?
Notez que je connais une autre façon d'implémenter des lignes (ou des colonnes) gelées. Exemple de colonne gelée . Mais ce n'est pas exactement ce dont j'ai besoin, car cette technique masque la première ligne (colonne) du widget de la table principale (arbre) et l'affiche dans le widget de recouvrement (statique). Dans mon cas, j'ai besoin d'une information différente dans la zone située sous l'en-tête et le widget principal doit être déplacé vers le bas pour afficher toutes les rangées.