FAQ Qt
FAQ QtConsultez toutes les FAQ
Nombre d'auteurs : 26, nombre de questions : 298, dernière mise à jour : 15 juin 2021
Pour pouvoir intégrer un delegate dans une vue, il faut tout d'abord sous-classer QItemDelegate (ou bien QAbstractItemDelegate), puis redéfinir sa fonction paint(). Une fois cela fait, il ne reste plus qu'à intégrer une instance de la classe créée dans la vue en question par le biais d'une des fonctions suivantes, fournies par QAbstractItemView, donc disponibles pour QTreeView, QListView, etc.
QAbstractItemView est une classe très utile car elle propose des méthodes permettant d'afficher des éléments dans des modèles. Elle permet aussi de modifier leurs propriétés par le biais du modèle conteneur, ce qui la rend plutôt attrayante. Passer par QItemDelegate pour réaliser des delegates de simples widgets permet à ces derniers de bénéficier de possibilités plus vastes que celles qui sont proposées par QAbstractItemView. Quant à elle, la classe QStyledItemDelegate est recommandée lors de la création de delegates personnalisés ou bien lors de l'utilisation de feuilles de style.
La méthode sizeHint() est une méthode très utile dans le sens où elle permet de récupérer la taille que devrait avoir le delegate. C'est pour cela qu'il est possible de la réimplémenter.
La fonction paint() est sans doute la méthode la plus importante de celles qui sont disponibles pour les delegates. En effet, c'est elle qui permet de leur concevoir un rendu graphique. Si vous souhaitez offrir un rendu personnalisé à votre delegate, c'est cette méthode que vous devrez réimplémenter.
Il n'y a pas de liens de parenté entre ces deux-là. Au début il arrive de se tromper entre Item View et Graphics View, simplement car il y a "View" dans les deux noms. Graphics View permet de dessiner et gérer des objets 2D. Item View permet de gérer des éléments (les items), et de les représenter visuellement (en table, liste et arbre). Rien n'empêche de combiner ces deux infrastructures, mais il faut prendre garde à ne pas les confondre lorsque l'on parcourt la documentation ou lorsque l'on réfère à l'un de ces éléments.
Model View est l'infrastructure de Qt qui permet de gérer les vues arborescentes, les listes et les tables. Il se base sur un pattern Model-View-Delegate.
Le modèle est une interface vers les données, ce qui permet d'abstraire la façon dont celles-ci sont représentées (mémoire, base de données, système de fichier, etc.).
La vue est la représentation visuelle des données sur l'écran. Qt fournit trois types de représentations : liste (QListView), arbre (QTreeView) et tableaux (QTableView).
Le délégué permet de faire le lien entre la vue et le modèle. Le délégué se charge de dessiner les éléments du modèle dans la vue, et de gérer l'édition de ces éléments.
Par rapport à Modèle-Vue-Contrôleur, le délégué est une sorte de super-contrôleur. Il génère un éditeur à la demande de la vue, et se charge de faire parvenir les informations au modèle, c'est son rôle de contrôleur. En plus de cela, le délégué se charge de dessiner les éléments du modèle, ce qui permet de personnaliser complètement la vue.
Les QTreeWidget trient leurs items grâce à l'opérateur < des QTreeWidgetItem. Par défaut, cet opérateur compare deux QString. Malheureusement, ceci ne correspond pas toujours à ce que l'on souhaite.
Pour y remédier, il suffit de créer sa propre classe d'item qui hérite de QTreeWidgetItem et qui redéfinit cet opérateur. Le principe utilisé est celui du polymorphisme.
Exemple : différence entre le tri lexical de QTreeWidgetItem et le tri numérique implémenté par notre classe item
Les QListWidget trient leurs items avec l'opérateur < des QListWidgetItem. Par défaut, cet opérateur compare deux QString. Malheureusement, ceci ne correspond pas toujours à ce que l'on souhaite. Pour y remédier, il suffit de créer sa propre classe d'item qui hérite de QListWidgetItem et qui redéfinit cet opérateur. Le principe utilisé est celui du polymorphisme.
Différence entre le tri par ordre croissant numérique implémenté par notre classe item (vue de gauche) et le tri par ordre croissant lexical des QListWidgetItem (vue de droite).
Pour effacer le contenu d'un QTableWidget c'est très simple, il faut tout d'abord effacer les QTableWidgetItem qu'il contient puis effacer toutes les lignes du tableau.
//On efface les QTableWidgetItem contenus dans le tableau
tableWidget->
clear();
//On efface toutes les lignes du tableau
tableWidget->
setRowCount(0
);
Les classes QListView, QTreeView et QTableView héritent toutes les trois de QAbstractItemView qui possède la propriété selectionMode.
Elle peut être définie par la fonction setSelectionMode() qui prend en paramètre l'un des types suivants :
- QAbstractItemView::SingleSelection : quand l'utilisateur sélectionne un élément, tous autres éléments déjà sélectionnés ne le sont plus. L'utilisateur ne peut pas désélectionner un élément en cliquant dessus ;
- QAbstractItemView::ContiguousSelection : quand l'utilisateur sélectionne un élément de façon normale, les éléments déjà sélectionnés ne le sont plus et le nouvel élément est sélectionné. Cependant, si l'utilisateur garde appuyée la touche Maj en cliquant sur l'élément, tous les éléments entre celui courant et celui cliqué sont sélectionnés ou désélectionnés en fonction de l'état de l'élément cliqué ;
- QAbstractItemView::ExtendedSelection : quand l'utilisateur sélectionne un élément de façon normale, les éléments déjà sélectionnés ne le sont plus et le nouvel élément est sélectionné. Si l'utilisateur garde appuyée la touche Ctrl en cliquant sur l'élément, il sera sélectionné et les autres éléments inchangés. Il est possible de combiner cette action avec la précédente en gardant appuyée la touche Maj ;
- QAbstractItemView::MultiSelection : quand l'utilisateur sélectionne un élément de façon normale, il devient sélectionné et les autres éléments inchangés. Plusieurs éléments peuvent être sélectionnés en déplaçant la souris au-dessus d'eux ;
- QAbstractItemView::NoSelection : les éléments ne peuvent pas être sélectionnés.
Les classes QListWidget, QTreeWidget et QTableWidget peuvent également utiliser cette propriété du fait qu'elles héritent respectivement des classes citées ci-dessus.