Écrire des widgets sensibles au style
Un widget prenant en charge les styles s'adapte au style dans lequel il est dessiné. Au lieu de dessiner lui-même les cadres, les boutons et les indicateurs, il demande au style actuel de les dessiner et lui demande les mesures dont il a besoin pour agencer son contenu. Le widget présente alors un aspect natif sur toutes les plateformes, respecte la palette de l'application et adopte un style personnalisé ou une feuille de style, à l'instar des widgets propres à Qt.
Créer une option de style
Le style s’appuie sur les informations contenues dans un objet ` QStyleOption` ; la première étape d’un événement de dessin consiste donc à en remplir un. Choisissez la classe d’option correspondant à l’élément que vous souhaitez dessiner, appelez la méthode ` QStyleOption::initFrom()` pour définir les indicateurs d’état, le rectangle, la palette et les métriques de police communes à tous les widgets, puis définissez les membres spécifiques à votre élément.
Les widgets Qt effectuent cette opération dans une fonction virtuelle protégée ` initStyleOption() `, afin que les sous-classes puissent ajuster les options. Suivez le même modèle dans votre widget.
Dessiner via le style
Dessinez les éléments à l’aide des fonctions de dessin de ` QStyle`, en leur passant l’option, un ` QPainter` et le widget lui-même :
QPainter painter(this);
...
style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this);QStylePainter combine un ` QStyle`, un ` QPainter` et un ` QWidget`. Ses fonctions de dessin ne prennent en paramètre que l’élément et l’option, ce qui raccourcit le code :
QStylePainter painter(this);
...
painter.drawPrimitive(QStyle::PE_FrameFocusRect, option);
Utilisez la palette de l’option, ou QWidget::palette(), pour toute couleur que vous dessinez vous-même, afin que le widget suive la palette de l’application et fonctionne aussi bien avec les thèmes clairs que sombres.
Renseignez-vous sur les dimensions dans le fichier de style
Basez vos appels à ` sizeHint()` et ` minimumSizeHint()` sur le style. ` sizeFromContents()` convertit la taille de votre contenu en taille du widget pour un type de contenu donné, et ` pixelMetric()` renvoie les largeurs de cadre, les marges et les tailles des indicateurs du style. Utilisez ` subElementRect()` pour déterminer où le style place les parties d’un élément, au lieu de calculer vous-même les positions.
Signaler l’état du widget
Le style n’affiche les effets de survol et de mise en surbrillance que si les indicateurs d’état sont activés. Définissez l’attribut ` WA_Hover ` sur votre widget pour recevoir les événements de survol, et ajoutez ` State_MouseOver ` à l’option lorsque la souris survole l’élément. Définissez ` State_Sunken ` lorsque le widget est enfoncé, et ` State_On`, ` State_Off` ou ` State_NoChange ` pour les éléments cochables. La référence des styles de widgets répertorie les indicateurs attendus par chaque élément.
Suivre les modifications de style et de palette
Lorsque le style ou la palette de l’application change, le widget reçoit un événement « QEvent::StyleChange » ou « QEvent::PaletteChange » dans la méthode ` changeEvent()`. Invalidez toutes les métriques mises en cache à ce moment-là et appelez ` updateGeometry()` si votre indication de taille dépend du style.
Prise en charge des mises en page de droite à gauche
Dans une mise en page de droite à gauche, le style inverse les éléments asymétriques. Utilisez visualRect() pour convertir un rectangle des coordonnées logiques en coordonnées d’écran et visualAlignment() pour inverser un alignement, puis transmettez l’option direction au style. Testez avec l’option de ligne de commande -reverse.
Voir également QStyle, QStylePainter, QStyleOption, Comment un style dessine un widget et Référence des styles de widget.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.