Qt &引用;现在几点了;通过拖动指针

Qt &引用;现在几点了;通过拖动指针,qt,qml,drag,snapping,mousearea,Qt,Qml,Drag,Snapping,Mousearea,我正在尝试实现一个用Qt编写的小型教学程序,在并行学习时使用QML 我想知道在时钟指针的循环拖动过程中是否有可能获得实时数据。您是否建议从Qt的“定制拨号”开始 它将只是一个带有小时指针的时钟(间隔为1小时) 我试图自定义下面的代码,以便将处理程序移出圆圈,如果可能的话,将其替换为具有三角形形状的svg图像。将间隔时间改为1h而不是秒也是一项挑战。到目前为止还没有工作…:) 导入QtQuick 2.0 长方形{ id:根; 宽度:720; 身高:480; 颜色:“黑色”; 项目{ id:集装箱;

我正在尝试实现一个用Qt编写的小型教学程序,在并行学习时使用QML

我想知道在时钟指针的循环拖动过程中是否有可能获得实时数据。您是否建议从Qt的“定制拨号”开始

它将只是一个带有小时指针的时钟(间隔为1小时)


我试图自定义下面的代码,以便将处理程序移出圆圈,如果可能的话,将其替换为具有三角形形状的svg图像。将间隔时间改为1h而不是秒也是一项挑战。到目前为止还没有工作…:)

导入QtQuick 2.0
长方形{
id:根;
宽度:720;
身高:480;
颜色:“黑色”;
项目{
id:集装箱;
宽度:250;
高度:宽度;
archors.centerIn:父对象;
不动产中心:(宽度/2);
不动产中心:(高度/2);
长方形{
id:rect;
颜色:“白色”;
transformOrigin:Item.Center;
半径:(宽度/2);
抗锯齿:真;
锚固件。填充:父级;
长方形{
id:手柄;
颜色:“红色”;
宽度:50;
高度:宽度;
半径:(宽度/2);
抗锯齿:真;
锚定{
top:parent.top;
利润率:10;
horizontalCenter:parent.horizontalCenter;
}
鼠耳{
锚固件。填充:父级;
已更改的位置:{
var point=mapToItem(容器,mouse.x,mouse.y);
var diffX=(point.x-container.centerX);
var diffY=-1*(point.y-container.centerY);
var rad=Math.atan(diffY/diffX);
var deg=(rad*180/数学PI);
if(diffX>0&&diffY>0){
直线旋转=90-数学绝对值(度);
}
else if(diffX>0&&diffY<0){
直线旋转=90+数学绝对值(度);
}
else if(diffX<0&&diffY>0){
直线旋转=270+数学绝对值(度);
}
else if(diffX<0&&diffY<0){
直线旋转=270-数学绝对值(度);
}
}
}
}
}
正文{
文本:“%1秒”.arg(Math.round(rect.rotation/6));
字体{
像素大小:20;
粗体:正确;
}
archors.centerIn:父对象;
}
}
}

我不建议定制刻度盘,因为它的固定角度范围限制为-140到140。你需要360度的旋转,不会在任何地方开始或停止。因此,您需要一个完全自定义的实现。任务可以作为自定义项轻松实现。根据我的经验,这将花费更少的时间,工作更快更稳定。定制一些现成的项目将不会如此灵活。特别是如果所有这些都是为了培训目的。非常感谢您的回复。对我需要指针捕捉到每个小时间隔。这正是我想做的。
import QtQuick 2.0

Rectangle{
    id: root;
    width: 720;
    height: 480;
    color: "black";

    Item {
        id: container;
        width: 250;
        height: width;
        anchors.centerIn: parent;

        property real centerX : (width / 2);
        property real centerY : (height / 2);

        Rectangle{
            id: rect;
            color: "white";
            transformOrigin: Item.Center;
            radius: (width / 2);
            antialiasing: true;
            anchors.fill: parent;

            Rectangle {
                id: handle;
                color: "red";
                width: 50;
                height: width;
                radius: (width / 2);
                antialiasing: true;
                anchors {
                    top: parent.top;
                    margins: 10;
                    horizontalCenter: parent.horizontalCenter;
                }

                MouseArea{
                    anchors.fill: parent;
                    onPositionChanged:  {
                        var point =  mapToItem (container, mouse.x, mouse.y);
                        var diffX = (point.x - container.centerX);
                        var diffY = -1 * (point.y - container.centerY);
                        var rad = Math.atan (diffY / diffX);
                        var deg = (rad * 180 / Math.PI);
                        if (diffX > 0 && diffY > 0) {
                            rect.rotation = 90 - Math.abs (deg);
                        }
                        else if (diffX > 0 && diffY < 0) {
                            rect.rotation = 90 + Math.abs (deg);
                        }
                        else if (diffX < 0 && diffY > 0) {
                            rect.rotation = 270 + Math.abs (deg);
                        }
                        else if (diffX < 0 && diffY < 0) {
                            rect.rotation = 270 - Math.abs (deg);
                        }
                    }
                }
            }
        }
        Text {
            text: "%1 secs".arg (Math.round (rect.rotation / 6));
            font {
                pixelSize: 20;
                bold: true;
            }
            anchors.centerIn: parent;
        }
    }
}