4 votes

setViewportMargins() et les lignes et colonnes "verrouillées".

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 :

  1. 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é) ?
  2. 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.

2voto

evilruff Points 2238

En fait, c'est une très bonne question. Personnellement, je ne pense pas que setViewportMargins() soit une solution. En jouant avec viewportMargins, la seule chose que vous pouvez obtenir est de 'décaler' les frontières où QTableView dessinera le modèle attaché et ensuite vous devez gérer les espaces vides autour en dessinant des rangées 'gelées' etc. Pour que ces espaces vides soient "dessinés par le propriétaire", vous devez toujours rechercher le style de grille, la taille des polices, etc. de la "grille principale" pour que vos lignes/colonnes "gelées" aient la même apparence que la grille principale.

J'ai essayé plusieurs approches pour le rendre décemment agréable et pratique pour écrire du code. À la fin, j'ai fini par créer un widget qui combine la grille principale (sans en-têtes), les grilles supérieure et gauche AVEC en-têtes + un widget d'angle. En faisant cela, j'ai obtenu un moyen assez direct de gérer les pièces gelées avec des filtres de modèle au-dessus d'un modèle de grille principale, ainsi qu'un moyen facile d'avoir des séparateurs pour les pièces "gelées", etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X