Tworzę zegar zegarowy, w którym można ustawić czas, przeciągając rękę zegara (za pomocą wprowadzania dotykowego lub myszy). W tym celu mam zdefiniowany element AnalogClockHand jak pokazano poniżej,Jak obracać prostokąt qml przeciągając?
AnalogClockHand.qml
Rectangle {
id: hand
property alias rotationAngle: handRotation.angle
x: (parent.width/2) - (width/2); y: (parent.height/2) - height; z: 2
width: units.gu(1); height: units.gu(14);
radius: units.gu(1)
color: Constants.coolGrey
antialiasing: true
transform: Rotation {
id: handRotation
origin { x: hand.width/2; y: hand.height }
Behavior on angle {
SpringAnimation { spring: 2; damping: 0.3; modulus: 360 }
}
}
}
W głównym pliku QML, kiedyś ten element i dodać mouseArea do niego, jak pokazano poniżej,
główna QML File
AnalogClockHand {
id: secondHand
z: parent.z - 1;
height: units.gu(17); width: units.gu(0.5)
rotationAngle: seconds * 6;
antialiasing: true;
// Implements touch support
MouseArea {
id: timerbackmousearea
property real truex: mouseX - parent.width/2
property real truey: parent.height/2 - mouseY
property real angle: Math.atan2(truex, truey)
property real strictangle: parseInt(angle * 180/Math.PI)
property real modulo: strictangle % 6
anchors.fill: parent
preventStealing: true
onPositionChanged: if (timerbackmousearea.angle < 0) {
secondHand.rotationAngle = strictangle - modulo + 360;
timerValue = parseInt(secondHand.rotationAngle/6);
seconds = timerValue;
}
else {
secondHand.rotationAngle = strictangle - modulo + 6;
timerValue = parseInt(secondHand.rotationAngle/6);
seconds = timerValue;
}
}
}
Ta logika jest jednak nie działa prawidłowo i jest bardzo łuszcząca. Więc nie można ustawić czasu tak płynnie. Pod koniec dnia próbuję zaimplementować coś tak, jak pokazano na poniższym obrazku. Użytkownik powinien mieć możliwość przesunięcia godziny, minuty lub sekundy, aby ustawić godzinę.
Czy istnieje lepsza logika kodu, którą mógłbym wprowadzić?
Uwaga 1: zdaję sobie sprawę, że druga ręka jest bardzo mała na obrazku, ale to powinno zostać wkrótce poprawione.