Added fake toggle switch.

This commit is contained in:
2026-03-31 18:18:37 +02:00
parent 5db2677d76
commit 075aadc665
6 changed files with 89 additions and 14 deletions

View File

@@ -85,6 +85,12 @@ void BCToggleSwitch::paintEvent(QPaintEvent *)
// Option A: Nutze die Standard-Hintergrundfarbe des aktuellen Qt-Themes
p.fillRect(rect(), palette().window());
// Auf deaktivierten Zustand prüfen und die statische Methode aufrufen
if (!isEnabled()) {
paintToggleIndicator(&p, rect(), isChecked(), m_position, palette());
return;
}
// --- Farben ---
// Tipp: In einem echten Projekt diese Farben als const statics
// oder aus der QPalette laden.
@@ -147,6 +153,64 @@ void BCToggleSwitch::paintEvent(QPaintEvent *)
p.drawEllipse(knobRect);
}
void BCToggleSwitch::paintToggleIndicator(QPainter* p, const QRect& rect, bool isChecked, float position, const QPalette& palette)
{
// --- Farben für den deaktivierten Zustand ---
QColor disabledBorderColor = palette.color(QPalette::Disabled, QPalette::Window);
if (!disabledBorderColor.isValid() || disabledBorderColor == Qt::black) {
disabledBorderColor = QColor(0xCCCCCC); // Fallback auf ein neutrales Hellgrau
}
QColor disabledKnobColor = QColor(0xAAAAAA);
QColor disabledOnColor = QColor(0x99C2E3); // Entsättigtes, blasses "Fluent Blue"
QColor white = QColor(0xF0F0F0); // Leicht abgedunkeltes Weiß
QRectF r(rect);
qreal radius = r.height() / 2.0;
// 1. Hintergrund (Track) zeichnen
p->setPen(Qt::NoPen);
if (isChecked || position > 0.5f)
{
// AN-Zustand (deaktiviert)
p->setBrush(disabledOnColor);
p->drawRoundedRect(r, radius, radius);
}
else
{
// AUS-Zustand (deaktiviert)
p->setBrush(Qt::NoBrush);
p->setPen(QPen(disabledBorderColor, 1.5));
// Rechteck etwas verkleinern, damit der Rahmen nicht abgeschnitten wird
p->drawRoundedRect(r.adjusted(1, 1, -1, -1), radius - 1, radius - 1);
}
// 2. Knopf (Thumb) zeichnen
qreal padding = 3.0;
qreal knobDiameter = r.height() - (2 * padding);
// X- und Y-Offsets des übergebenen Rects berücksichtigen!
qreal startX = r.x() + padding;
qreal endX = r.x() + r.width() - knobDiameter - padding;
qreal currentX = startX + (position * (endX - startX));
QRectF knobRect(currentX, r.y() + padding, knobDiameter, knobDiameter);
p->setPen(Qt::NoPen);
if (isChecked || position > 0.5f)
{
p->setBrush(white);
}
else
{
p->setBrush(disabledKnobColor);
}
p->drawEllipse(knobRect);
}
void BCToggleSwitch::enterEvent(QEnterEvent *event)
{
update(); // Für Hover-Effekt neu zeichnen