C
Indicators: Creating Safety-Critical UI
// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial
// This file is part of the Qt Safe Renderer module
import QtQuick
import QtQuick.Window
import Qt.SafeRenderer
import QtQuick.Controls
import QtQml.Models
Window {
visible: true
width: 250
height: 325
title: qsTr("Control UI")
id: root
color: "#f3f3f4"
Column {
x: 140
width: 30
height: 300
Row {
Switch {
id: mySwitchBattery
checked: true
onCheckedChanged: {
QSafeMessageSender.changeState("iconBattery", checked?"ON":"OFF")
}
}
SafePicture {
id: iconBattery
objectName: "iconBattery"
width: 30
height: 30
color: "#e41e25"
fillColor: "black"
source: "qrc:/iso-icons/iso_grs_7000_4_0247.dat"
}
}
Row {
Switch {
id: mySwitchHighBeam
checked: true
onCheckedChanged: {
QSafeMessageSender.changeState("iconHighBeam", checked?"ON":"OFF")
}
}
SafePicture {
id: iconHighBeam
width: 30
height: 30
color: "#1e8fe4"
fillColor: "black"
source: "qrc:/iso-icons/iso_grs_7000_4_0082.dat"
}
}
Row {
Switch {
id: mySwitchLowBeam
checked: true
onCheckedChanged: {
QSafeMessageSender.changeState("iconLowBeam", checked?"ON":"OFF")
}
}
SafePicture {
id: iconLowBeam
width: 30
height: 30
color: "#5caa15"
fillColor: "black"
source: "qrc:/iso-icons/iso_grs_7000_4_0083.dat"
}
}
Row {
Switch {
id: mySwitchParkingBrake
checked: true
onCheckedChanged: {
QSafeMessageSender.changeState("iconParkingBrake", checked?"ON":"OFF")
}
}
SafePicture {
id: iconParkingBrake
objectName: "iconParkingBrake"
width: 30
height: 30
color: "#e41e25"
fillColor: "black"
source: "qrc:/iso-icons/iso_grs_7000_4_0238.dat"
}
}
Row {
Switch {
id: mySwitchDayLights
checked: true
onCheckedChanged: {
QSafeMessageSender.changeState("iconDayLights", checked?"ON":"OFF")
}
}
SafePicture {
id: iconDayLights
objectName: "iconDayLights"
width: 30
height: 30
source: "qrc:/iso-icons/iso_grs_7000_4_0456.dat"
color: "#5caa15"
fillColor: "black"
}
}
Row {
Switch {
id: mySwitchTyre
checked: true
onCheckedChanged: {
QSafeMessageSender.changeState("iconTyre", checked?"ON":"OFF")
}
}
SafePicture {
id: iconTyre
objectName: "iconTyre"
width: 30
height: 30
color: "#face20"
fillColor: "black"
source: "qrc:/iso-icons/iso_grs_7000_4_1434A.dat"
}
}
Row {
Switch {
id: mySwitchLamp
checked: true
onCheckedChanged: {
QSafeMessageSender.changeState("iconLamp", checked?"ON":"OFF")
}
}
SafePicture {
id: iconLamp
objectName: "iconLamp"
width: 30
height: 30
source: "qrc:/iso-icons/iso_grs_7000_4_1555.dat"
color: "#face20"
fillColor: "black"
}
}
Row {
Switch {
id: mySwitchSeatbelt
checked: true
onCheckedChanged: {
QSafeMessageSender.changeState("iconSeatbelt", checked?"ON":"OFF")
}
}
SafePicture {
id: iconSeatbelt
objectName: "iconSeatbelt"
width: 30
height: 30
color: "#e41e25"
fillColor: "black"
source: "qrc:/iso-icons/iso_grs_7000_4_0249.dat"
}
}
}
ButtonGroup {
buttons: column.children
}
Column {
id: column
RadioButton {
checked: true
text: qsTr("R")
onClicked: QSafeMessageSender.changeState("root","reverse")
}
RadioButton {
text: qsTr("N")
onClicked: QSafeMessageSender.changeState("root","neutral")
}
RadioButton {
text: qsTr("D")
onClicked: QSafeMessageSender.changeState("root","drive")
}
RadioButton {
text: qsTr("P")
onClicked: QSafeMessageSender.changeState("root","park")
}
}
Label {
width: slider.width
wrapMode: Label.Wrap
horizontalAlignment: Qt.AlignHCenter
y: 275
x: 25
text: "Change the speed."
}
Slider {
id: slider
from: 0
to: 300
stepSize: 1
value: 0
y: 285
x: 20
background: Rectangle {
x: slider.leftPadding
y: slider.topPadding + slider.availableHeight / 2 - height / 2
implicitWidth: 200
implicitHeight: 4
width: slider.availableWidth
height: implicitHeight
radius: 2
color: "#cecfd5"
Rectangle {
width: slider.visualPosition * parent.width
height: parent.height
color: "#41cd52"
radius: 2
}
}
handle: Rectangle {
x: slider.leftPadding + slider.visualPosition * (slider.availableWidth - width)
y: slider.topPadding + slider.availableHeight / 2 - height / 2
implicitWidth: 26
implicitHeight: 26
radius: 13
color: slider.pressed ? "#f0f0f0" : "#f6f6f6"
border.color: "#cecfd5"
}
onValueChanged: {
if (slider.value >= 1 && slider.value <= 299) {
QSafeMessageSender.setText("safetextitem", slider.value + stepSize)
} else {
QSafeMessageSender.setText("safetextitem", slider.value)
}
}
}
}