Erstellung der CSS Datei

Für die Implementierung des individuellen Style Sheets, ist die Erstellung einer *.css Datei erforderlich.

Bei der Erstellung einer CSS Datei muss eine Reihe von Regeln beachtet werden. Eine Style-Regel besteht aus zwei Elementen - dem Selektor und der Deklaration.

Der Selektor definiert die Objekte, welche von der Regel beeinflusst werden.

Die Deklaration definiert die Eigenschaften, welche am Objekt gesetzt werden.

Im Folgenden finden Sie Beispiele mit allgemeinen Regeln für eine CSS Datei und mit einer Beispiel-CSS Datei, deren Inhalt Auswirkungen auf ein Panel hat.

Beispiel

QPushButton { color: red }

Der Befehlsknopf (QPushButton) ist ein Beispiel für einen Selektor und { color: red } ist die Deklaration. Die Regel definiert, dass alle Befehlsknöpfe die Vordergrundfarbe Rot haben sollen.

Beispiel

QLineEdit, QComboBox { color: red; background-color: white }

Mehrere Selektoren können über ein Komma zwischen zwei Selektoren für die gleiche Deklaration definiert werden.

Beispiel

PanelQT#myPanel QMenu { background-color: white }
PanelQT[type="configuration"] { background-color: darkgray }

Regeln können durch Verwendung des Nachkommen-Selektors bzw. des ID-Selektors noch näher definiert werden. So würden in diesem Beispiel etwa nur Popupmenüs (QMenu) die Hintergrundfarbe Weiß haben, die auf einem Panel mit Namen "myPanel" geöffnet werden. Für Panels die "configuration" als Typnamen definiert haben, wird eine dunkelgraue Hintergrundfarbe definiert.

Anmerkung: Wird während der Laufzeit der Name oder der Typ eines Panels/Widgets verändert, so muss das Stylesheet mit Hilfe von setApplicationProperty() erneut angewandt werden.
Anmerkung: Ein Re-rendering des Stylesheets kann auch mit
shape.stylesheet("")
durchgeführt werden.

In einer Deklaration können mehrere Eigenschaften gesetzt werden. Die Eigenschaften werden von geschweiften Klammern eingeschlossen ({}) und mit Semikolons getrennt.

Eine Auflistung der unterstützten Eigenschaften finden Sie in der externen Dokumentation des Qt Toolkits: List of Properties.

Alle Eingaben zu den Eigenschaften in der Datei sind case insensitive, d.h. Klein-/Großschreibung wird nicht beachtet. Klassennamen, Objektnamen und Eigenschaftennamen sind jedoch case sensitive.

In der folgenden Tabelle werden die wichtigsten Varianten eines Selektors dargestellt.

Selektor Beispiel Beschreibung
Universeller Selektor * Wählt alle Widgets.
Typ-Selektor QPushButton Wählt alle Instanzen eines Widgets-Typs.
Eigenschaften-Selektor QPushButton[flat="false"]

Wählt die Instanzen eines Widgets, welches nicht flach ist.

Dieser Selektor kann dazu verwendet werden, um dynamische Eigenschaften zu testen.

Anstatt = kann ebenso ~= verwendet werden, um zu testen, ob eine Eigenschaft des Typs QStringList einen gegebenen QString beinhaltet.

Klassen-Selektor .QPushButton

Wählt die Instanzen eines Widgets, jedoch nicht seine Subklassen.

Ist äquivalent zu *[class~="QPushButton"].

ID-Selekor QPushButton#okButton Wählt alle Widgets, deren Objektname dem hier eingegebenen gleicht.
Nachkommen-Selektor QDialog QPushButton Wählt alle Instanzen des Widgets, die zu den Nachkommen des hier im ersten Selektor-Teil angegebenen Selektors sind.
Kind-Selektor QDialog > QPushButton Wählt alle Instanzen des Widgets, die direkte Kinder des ersten Selektors sind.
Anmerkung:

Die Schriftgröße eines Tab Widgets kann nur gesetzt werden wenn QTabBar anstelle von QTabBar::tab verwendet wird.

Anmerkung:

Jedes Widget besitzt das Attribute "type", welches innerhalb der CSS Datei als Selektor für die entsprechenden Widgets verwendet werden kann und so eine weitere Unterteilung des Typ-Selektors ermöglicht (vgl. Tabelle oberhalb). z.B.: Setzt für alle schließenden Button (mit dem Typ "BtnSchliessen") die Farbe auf rot.

Widget[type = "BtnSchliessen"] { color: red }
Anmerkung:

Für die Verwendung des "type" Attributes der Klassen QCheckBox und QRadioButton muss die übergeordenete Klasse "MultiLabeldParent verwendet werden, z.B.:

MultiLabeledParent[type = "STYLE"] QCheckBox { color: red }

Beispiel 2

Im Folgenden sehen Sie die Darstellung des Panels ASCIIMan.pnl einmal mit implementiertem Style Sheet und einmal ohne. Unter den beiden Abbildungen bekommen Sie einen Einblick in den Inhalt der CSS Datei, die für diese Darstellung implementiert wurde.

Abbildung: AsciiMan.pnl ohne Style Sheet

Abbildung: Beispiel des AsciiMan.pnl mit Style Sheet

QComboBox, QSpinBox, QLineEdit
{
  border: 2px solid blue;
  border-radius: 7px;
  padding: 0 3px;
  background: lightblue;
  selection-background-color: darkgray;
}
QComboBox::drop-down
{
  border-radius: 7px;
  border-left-width: 1px;
  border-left-color: darkgray;
  border-left-style: solid;
}
QComboBox::down-arrow
{
  image: url(pictures:down.xpm);
}
QCheckBox::indicator
{
  border: 1px solid blue;
  border-radius: 3px;
}
QCheckBox::indicator:checked
{
  image: url(pictures:checked.png);
}
MultiLabeledParent { background: rgba(0, 0, 0, 0); }
QPushButton
{
  border: 2px solid rgb(255, 167, 43);
  background: rgb(255, 224, 137);
  border-radius: 7px;
  font-family: "New Century Schoolbook";
  font-size: 14px;
  font-style: bold;
}
PanelQT
{
  background-color: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #FFAFC0, stop: 1 #FFFFFF);
}
TrendPlot, TrendScaleQT, ClockQT
{
  background-color: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #03AFC0, stop: 1 #FF77FF);
}

Auswahl Operatoren - Attribute

Innerhalb von CSS stehen mehrere Operatoren zur Verfügung um die Auswahl der Attribute genauer festlegen zu können. Folgende Möglichkeiten an Operatoren sind innerhalb von WinCC OA zur Verfügung:

  • "=" - Wählt genau den Typ aus, der dem angegebenen Wert entspricht.
  • "^=" - Wählt den Typ aus, welcher mit dem angegebenen Wert beginnt.
  • "$=" - Wählt den Typ aus, welcher mit dem angegebenen Wert endet.
  • "*=" - Wählt den Typ aus, welcher den angegebenen Wert beinhaltet.
  • "~=" - Wählt den Typ aus, der den angegebenen Wert beinhaltet. Hierbei darf der Wert aber nur als vollständiges Wort mit Trennung durch ein Leerzeichen enthalten sein, z.B. [type ~= "navigation"] - Type: "navigation area"
  • "|=" - Wählt alle Typen aus, welche mit dem angegebenen Wert beginnen. Hierbei muss der Wert aber ein vollständiges Wort sein, welchem innerhalb der Instanz nur ein Trennstrich folgen darf. z.B. [type |= "top"] "top-area"

Weitere Informationen und Beispiele zu diesen Operatoren können hier [W3C School] gefunden werden.

Refernzieren von Bildern in CSS Styles

Folgende Informationen müssen beachtet werden bei der Verwendung von Bildreferenzen innerhalb von Stylesheets:

  • Der Pfad des Bildes muss relative zum Stylesheet angegeben werden, z.B. image: url("pictures/down_en.png");
  • Es ist nicht möglich Ordner in den Ebenen überhalb des Stylesheets mittels relativer Pfade zu adressieren, z.B.. ../images/myImage.png kann nicht verwendet werden.
  • Es ist möglich Bilder innerhalb des /pictures Verzeichnisses von WinCC OA mittels "pictures:" Prefix direkt zu adressieren, z.B. image: url(pictures:down_en.png);
  • Stylesheets können mit einem statischen Pfad außerhalb der WinCC OA Verzeichnisse unter Verwendung des "-stylesheet" Parameters des UI Managers angegeben werden.

Verwenden von WinCC OA Farben in CSS Styles

Farben, die in einer WinCC OA Farbdatenbank definiert wurden, können in CSS Styles verwendet werden. Die Farben werden mit der Pseudo-Funktion oa-color() aufgerufen. Die Namen werden vor der Interpretation der CCS Datei durch ihre korrespondierenden RGBA Werte ersetzt. Dies kann verwendet werden für:

  • Die "stylesheet.css"-Datei im "config"-Ordner
  • Stylesheets, die mit dem -stylesheet Kommandozeilen-Argument spezifiziert werden
  • Stylesheets, die über die Stylesheet-Property eines Panels oder Widgets gesetzt werden

Beispiel

Setzen der Farben eines Befehlsknopfs auf in einer Farbdatenbank definierte Werte:

QPushButton
{
  color: oa-color(_ETM);
  background: oa-color(STD_param_warning);
  border: 2px solid oa-color(SiemensSand);
}

Trend Widget - CSS Beispiele

Folgende Beispiele zeigen, wie bestimmte Elemente des Trends mittels Style Sheets angesprochen werden können:

Trend Legende Hintergrund

TrendLegend { background: steelblue; }

Abbildung: Trend Legende

Anmerkung:

Um nur den Hintergrund bestimmter Trend Legenden zu verändern kann zusätzlich dem Trend ein eigener Typ angegeben werden, z.B. "TrendQT[type="myTrend"] TrendLegend { background: red; }"

Trend Befehlsschaltflächen

Die Trend Schaltflächen für "Zoom zurücksetzen" und "Zoom Rückgängig" können mit den Namen "zoomReset" oder "zoomUndo" angesprochen werden, z.B.

QPushButton#zoomReset
{
 qproperty-icon: url(pictures:arc.png)
}
QPushButton#zoomUndo
{
 qproperty-icon: url(pictures:checkbox.png)
}

Zoom Auswahl / Rubberband- Selektion

TrendPlot
{
  qproperty-rubberBandLineColor: red;
  qproperty-rubberBandFillColor: qlineargradient(x1:0,y1:0, x2:0, y2:1, stop:0 rgba(255, 255, 255, 80), stop:1 rgba(0, 255,
 0, 130));
}
Anmerkung:

Die Eigenschaft "qproperty-rubberBandLineColor" wird ebenfalls für einen sich bewegenden Ruler verwendet. Es kann nur eine Color und keine "Brush" verwendet werden! Für die Eigenschaft "qproperty-rubberBandFillColor" ist die Verwendung von "Brushes" möglich, siehe Qt-Dokumentation.

Abbildung - Zoom Auswahl

ViewPort Widget

Die einzelnen Elemente des ViewPorts können über ihre jeweligen Klassen angesprochen werden:

TrendAreaViewportHandle
{
   min-width: 10px;
   min-height: 10px;
   background-image: url(pictures:abottom.png);
   background-repeat: no-repeat;
   background-position: center;
   background-color: qlineargradient(x1:0,y1:0, x2:0, y2:1, stop:0 white, stop: 0.4 gray, stop:1 green);
}
TrendAreaViewport > QWidget#viewport_leading
{
  background-color: rgba(12, 80, 200, 40)
}
TrendAreaViewport > QWidget#viewport_trailing
{
  background-color: rgba(12, 80, 200, 140)
}
TrendAreaViewport > QWidget#viewport_window
{
  background-color: rgba(255, 255, 20, 40)
}

Abbildung: Viewport mit und ohne angewandtem Stylesheet Beispiel

Trend Markierungen

Für die Markierungen der Trend Zeit/Wert Skala kann über das Property "qproperty-tickStyle" der CSS Klassen "TrendTimeScale" sowie "TrendValueScale" festgelegt werden wie diese angezeigt werden. Zur Verfügung stehen folgende Optionen: AllTicks, NoSmallTicks, OnlyMainTicks und NoTicks.

TrendValueScale
{
  qproperty-ticksStyle: "OnlyMainTicks";
}

Trend Ruler

Kann nicht mittels CSS beeinflusst werden und muss mittels der Config Einträge trendRulerColor sowie trendRulerLineType innerhalb der [ui] Sektion. Nur ein bewegter Ruler kann mittels der CSS Eigenschaft "property-rubberBandLineColor" gesetzt werden, siehe Zoom Auswahl / Rubberband- Selektion.

ComboBox Dropdown Menü

Das Dropdown Menü einer Combobox sowie die darin beinhalten Elemente können wie folgt angesprochen werden:

QComboBox QAbstractItemView
{
  margin: 5px;
}
QComboBox[type = "myType"] QAbstractItemView::item
{
  margin: 10px;
}
Anmerkung:

Um die Elemente des Dropdowns anzusprechen muss auch ein zusätzlicher Style für die Combobox selbst vergeben werden, siehe Beispiel oberhalb.

Zusätzliche Hinweise

  • Die Eigenschaft "Schriftart" wird von Stylesheets nur verändert, wenn sie auf die "defaultFont" gesetzt ist. Das globale Stylesheet und das Eigenschafts/lokalem Stylesheet kann überschrieben werden. Die Reighenfolge der Überschreibungen ist:

    • Globales Stylesheet
    • Kann von dem lokalem Stylesheet überschreiben werden, wenn im globalen Stylesheet die "defaultFont" gesetzt ist.
    • Kann von der "Schriftart" Eigenschaft des Objekts überschrieben werden, unabängig vom Wert im globalen Stylesheet.

    Es wird deshalb empfohlen, die "Schriftart" Eigenschaft selbst, anstelle eines lokalen oder Eigenschafts-Stylesheets zu verwenden.

  • Für die Anzeige runder Ecken für das Objekt QTabBar ist es erforderlich innerhalb eines Control Skriptes, z.B. Inizialize des Tab-Widgets, die Eigenschaft documentMode zu deaktivieren:
<tabShape>.documentMode(false);
  • Um die Schriftart der Uhr mittels Stylesheet zu setzen müssen die .css Eigenschaften qproperty-dateFont bzw. qproperty-timeFont verwendet werden. Die Schriftart muss als Font String angegeben werden, z.B.:
ClockQT
{
  qproperty-dateFont: "Noto Sans,-1,33,5,75,0,0,0,0,0"
  qproperty-timeFont:"Noto Sans,-1,33,5,75,0,0,0,0,0";
}
  • Um margin und padding für eine Tabellenzelle zu setzen kann die Klasse TableQt::item verwendet werden. Bitte beachten Sie, dass irgendein Attribut für die TableQt Klasse gesetzt werden muss, anderenfalls werden die Einstellungen der untergeordneten Klasse "item" nicht angewandt.
  • Um eine Combobox innerhalb einer Tabelle (siehe "cellWidgetRC") anzusprechen muss die Klasse QComboBox als Child Klasse der QTableView Klasse angesprochen werden, z.B.
QTableView QComboBox
{
 color: red;
 border: 1px solid blue;
 border-radius: 9px;
 padding: 3px 18px 3px 3px;
}
  • Um für die Mobile UI Applikation sowie das Desktop UI auf eigene Stylesheets innerhalb des /config Verzeichnisses zugreifen zu können, müssen diese mittels httpConnect() entsprechend für den HTTP Server verfügbar gemacht werden (webclient_http.ctl), z.B:
httpConnect("getTouchStyleSheet", "/config/touchscreen.css","text/plain");
  • Um einen Rahmenobjekt mittels CSS zu stylen muss die CSS Klasse QGroupBox verwendet werden. Hierbei können die Objekte auch mittels Name und Type Selektor explizit angesprochen werden.
  • Die QMenu Instanzen die mit popupMenu() oder popupMenuXY() erstellt wurden, besitzen das "scripted" Attribut mit dem Wert "true". Dies erlaubt es, die vom UI generierten Popups von Popups, welche mit C++ oder dem Anwender mit Scripting erstellt wurden, zu unterscheiden. In der stylesheet.css kann nun zum Beispiel der folgende Code verwendet werden:
QMenu:enabled[scripted="true"]
{
  background: rgb(248,255,25);
  color: rgb(255,55,11);
  font-size: 18px;
}

Einschränkungen

Folgende Beschränkungen müssen bei der Verwendung von Stylesheets beachtet werden :

  • Minimum und Maximum Einstellungen innerhalb des Stylesheets (z.B. min-width oder min-height) werden nicht unterstützt, da diese die internen Einstellungen des Grafikobjektes beeinträchtigen und es zu Anzeigefehlern kommen kann.