J'ai un QListView avec sélection multiple activée et un délégué d'élément (QStyledItemDelegate) que j'utilise pour définir la taille des éléments et effectuer une peinture personnalisée. Mes besoins sont extrêmement simples :
- Hauteur de ligne 30 pour les éléments non sélectionnés
- Hauteur de ligne 60 pour les éléments sélectionnés
Je n'arrive pas à faire fonctionner cela.
J'ai essayé d'utiliser sizeHint sur mon QStyledItemDelegate
if (option.state & QStyle::State_Selected)
{
return QSize(100,60); /// <<<<------ JAMAIS ATTEINT
}
else
{
return QSize(100,30);
}
L'état n'est jamais sélectionné, ce qui est étrange car la même instruction if fonctionne parfaitement pour la méthode de peinture de la même classe, distinguant les lignes sélectionnées et non sélectionnées pour différents fonds de peinture.
Donc j'ai essayé quelque chose d'autre
J'ai rendu accessible le modèle de sélection (QItemSelectionModel) à la méthode sizeHint de mon délégué. En utilisant cela, je peux interroger avec succès si la ligne pour laquelle sizehint est appelé est sélectionnée ou non, et je retourne la taille correcte. Cependant, maintenant seule la dessin est faite dans la taille correcte. pour les éléments sélectionnés, le dessin a maintenant une hauteur de 60, ce qui est correct, mais cela chevauche les éléments en dessous. En d'autres termes : la nouvelle taille sizeHint est utilisée uniquement pour le DESSIN, mais pas pour rendre effectivement l'élément QListView plus haut. Il semble qu'un appel manquant à "mettre à jour" le QListView indique qu'un de ses éléments a changé de taille. Je n'ai pas besoin de simplement dessiner l'élément plus haut, j'ai besoin que l'élément soit plus haut à cette fin.
Il semble que sizeHint n'influence que la hauteur de l'élément au début lorsque tout est initialisé. si tout à coup vous retournez une valeur de hauteur plus élevée pour l'un des éléments à partir de votre sizeHint — cela n'augmentera pas le listView pour adapter la nouvelle hauteur.
Une observation intéressante :
Si je définis setResizeMode(QListView::Adjust) sur mon QListView, un léger redimensionnement du contrôle déclenchera un nouveau calcul de tous les éléments, fixant la taille de l'élément sélectionné réel tel que le dessin (qui est toujours fait à la bonne hauteur) ne se superpose pas à l'élément en dessous car la hauteur de l'élément est maintenant correcte. C'est ce que je dois faire lorsque la sélection change, provoquer un "nouveau calcul" comme le QListView::Adjust le fait. Comment puis-je faire cela ?
Ce que je fais maintenant est moche, et je suis sûr que ce n'est pas la bonne façon de le faire, mais je n'ai pas d'autre alternative. Je me connecte au modèle de sélection -- j'écoute les changements de sélection, et quand ils surviennent, je redimensionne la hauteur de mon QListView de 1 et puis je reviens à la taille d'origine. Cela génère un recalcul des tailles des éléments (setResizeMode(QListView::Adjust) et tout semble et fonctionne bien. Cela me rend juste malade de devoir le faire-- n'y a-t-il pas de meilleure façon de faire recalculer la hauteur des éléments SANS simuler un redimensionnement du QListView ?