Erstellen stilbewusster Widgets
Ein stilbewusstes Widget passt sich dem Stil an, in dem es gezeichnet wird. Anstatt Rahmen, Schaltflächen und Anzeigen selbst zu zeichnen, beauftragt es den aktuellen Stil damit, diese zu zeichnen, und fragt den Stil nach den Maßen, die es zum Anordnen seines Inhalts benötigt. Das Widget sieht dann auf jeder Plattform wie ein natives Widget aus, passt sich der Anwendungspalette an und übernimmt einen benutzerdefinierten Stil oder ein Stylesheet, genau wie die Qt Widgets.
Erstellen einer Stiloption
Der Stil greift auf die Informationen in einem ` QStyleOption` zurück; daher besteht der erste Schritt bei einem `paint`-Ereignis darin, einen solchen auszufüllen. Wählen Sie die Optionsklasse aus, die zu dem Element passt, das Sie zeichnen möchten, rufen Sie ` QStyleOption::initFrom()` auf, um die Statusflags, das Rechteck, die Palette und die Schriftart-Metriken festzulegen, die jedes Widget gemeinsam nutzt, und legen Sie anschließend die für Ihr Element spezifischen Mitglieder fest.
Die Qt Widgets führen dies in einer geschützten virtuellen Funktion ` initStyleOption() ` aus, sodass Unterklassen die Option anpassen können. Befolgen Sie in Ihrem Widget dasselbe Muster.
Zeichnen über den Stil
Zeichnen Sie die Elemente mit den Zeichenfunktionen von ` QStyle`, wobei Sie die Option, ein ` QPainter` und das Widget selbst übergeben:
QPainter painter(this);
...
style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this);QStylePainter kombiniert ein ` QStyle`, ein ` QPainter` und ein ` QWidget`. Seine Zeichenfunktionen nehmen nur das Element und die Option entgegen, was den Code kürzer macht:
QStylePainter painter(this);
...
painter.drawPrimitive(QStyle::PE_FrameFocusRect, option);
Verwende die Palette in der Option oder ` QWidget::palette()` für jede Farbe, die du selbst zeichnest, damit das Widget der Anwendungspalette folgt und sowohl in hellen als auch in dunklen Farbschemata funktioniert.
Frage den Stil nach den Größen ab
Stützen Sie Ihre Aufrufe von ` sizeHint()` und ` minimumSizeHint()` auf den Stil. ` sizeFromContents()` wandelt die Größe Ihrer Inhalte in die Größe des Widgets für einen bestimmten Inhaltstyp um, und ` pixelMetric()` gibt die Rahmenbreiten, Ränder und Indikatorgrößen des Stils zurück. Verwenden Sie ` subElementRect()`, um herauszufinden, wo der Stil die Teile eines Elements platziert, anstatt die Positionen selbst zu berechnen.
Den Status des Widgets melden
Der Stil zeichnet Hover- und Fokus-Effekte nur, wenn die Statusflags gesetzt sind. Setzen Sie das Attribut „ WA_Hover “ für Ihr Widget, um Hover-Ereignisse zu empfangen, und fügen Sie „ State_MouseOver “ zur Option hinzu, während sich die Maus über dem Element befindet. Setzen Sie „ State_Sunken “, während das Widget gedrückt wird, und „ State_On “, „ State_Off “ oder „ State_NoChange “ für ankreuzbare Elemente. Die Widget-Stilreferenz listet die Flags auf, die jedes Element erwartet.
Änderungen an Stil und Palette verfolgen
Wenn sich der Anwendungsstil oder die Palette ändert, erhält das Widget in der Methode ` changeEvent()` ein ` QEvent::StyleChange `- oder ` QEvent::PaletteChange `-Ereignis. Erledigen Sie dort alle zwischengespeicherten Metriken und rufen Sie ` updateGeometry()` auf, falls Ihr Größenhinweis vom Stil abhängt.
Unterstützung von Layouts von rechts nach links
In einem Layout von rechts nach links spiegelt der Stil asymmetrische Elemente. Verwenden Sie ` visualRect()` zur Umwandlung eines Rechtecks von logischen in Bildschirmkoordinaten und ` visualAlignment()` zur Spiegelung einer Ausrichtung, und übergeben Sie die Option ` direction ` an den Stil. Testen Sie dies mit der Befehlszeilenoption ` -reverse `.
Siehe auch „ QStyle“ , „ QStylePainter “, „ QStyleOption “, „Wie ein Stil ein Widget zeichnet“ und „Widget-Stil-Referenz“.
© 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.