QML實(shí)現(xiàn)鐘表效果
Qt5以后的版本,主要加大的對(duì)Qt Quick的改進(jìn)?,F(xiàn)實(shí)最新的版本可以利用Qt Quick實(shí)現(xiàn)很多的絢麗的效果。此里只是利用畫布Canvas簡(jiǎn)單鐘表的效果。效果如下:

源碼如下
import QtQuick 2.6
import QtQuick.Window 2.2
Window {
visible: true
width: 740
height: 680
title: qsTr("Hello World")
id:window
//color: "red";
Canvas
{
id : canvas
anchors.fill: parent
width: 740
height: 680
onPaint:
{
var ctx = getContext("2d");
drawBack(ctx);
drawDot(ctx);
var date = new Date();
var hours = date.getHours()
hours = hours%12;
var minutes = date.getMinutes()
var seconds = date.getUTCSeconds();
var timestr =date.toLocaleString("yyyy-MM-dd hh:mm:ss");
console.log(date.toLocaleString("yyyy-MM-dd hh:mm:ss"));
drawSecond(seconds,ctx);
drawHour(hours,minutes,ctx);
drawMinute(minutes,seconds,ctx);
drawSecond(seconds,ctx);
}
}
function drawBack(ctx)
{
var r = 200;
ctx.save();
ctx.beginPath();
ctx.translate(width/2,height/2);
ctx.clearRect(-r,-r,r*2,r*2);
ctx.lineWidth = 10;
ctx.arc(0,0,r-5,0,Math.PI*2,false); //外圓
ctx.stroke();
//畫文本
var numbers = [1,2,3,4,5,6,7,8,9,10,11,12];
ctx.font = "18px Arial";
ctx.textAlign = "center";
ctx.textBaseline = "middle";
for(var i = 0; i < 12; ++i)
{
var rad = 2*Math.PI/12*numbers[i]-3.14/2;
var x = Math.cos(rad)*(r-30);
var y = Math.sin(rad)*(r-30);
ctx.fillText(numbers[i],x,y);
}
//畫刻度
ctx.lineWidth = 2;
for (var i = 0; i <60; ++i)
{
ctx.beginPath();
var rad = 2*Math.PI/60*i;
var x = Math.cos(rad)*(r-15);
var y = Math.sin(rad)*(r-15);
var x2 = Math.cos(rad)*(r-10);
var y2 = Math.sin(rad)*(r-10);
//通過畫線也可以
if (i%5 === 0)
{ctx.strokeStyle="#000000";}
else
{ ctx.strokeStyle = "#989898";}
ctx.moveTo(x,y);
ctx.lineTo(x2,y2);
ctx.stroke();
//畫圓實(shí)現(xiàn)
// if (i%5 === 0)
// {ctx.fillStyle="#000000";}
// else
// { ctx.fillStyle = "#FFFFFF";}
// ctx.arc(x,y,2,0,3.15*2,false);
// ctx.fill();
}
ctx.restore();
}
function drawHour(hour, minute, ctx)
{
var r = 200;
ctx.save();
ctx.beginPath(); //必須寫
ctx.lineWidth = 7;
ctx.lineCap = "round";
ctx.translate(width/2,height/2);
var rad = Math.PI*2/12*hour+Math.PI*2*minute/12/60-Math.PI;
ctx.rotate(rad);
ctx.moveTo(0,-10);
ctx.lineTo(0,r/2-10);
ctx.stroke(); //必須寫(填充方式)
ctx.restore();
}
function drawMinute(minute,second,ctx)
{
var r = 200;
ctx.save();
ctx.beginPath(); //必須寫
ctx.lineWidth = 5;
ctx.lineCap = "round";
ctx.translate(width/2,height/2);
var rad = Math.PI*2*minute/60 + Math.PI*2*second/60/60 -Math.PI;
ctx.rotate(rad);
ctx.moveTo(0,-10);
ctx.lineTo(-10,r*3/5-10);
ctx.stroke(); //必須寫(填充方式)
ctx.restore();
}
function drawSecond(second,ctx)
{
var r = 200;
ctx.save();
ctx.beginPath(); //必須寫
ctx.lineWidth = 3;
ctx.lineCap = "round";
ctx.translate(width/2,height/2);
ctx.strokeStyle="#ff0000";
var rad = Math.PI*2*second/60-Math.PI;
ctx.rotate(rad);
ctx.moveTo(0,-20);
ctx.lineTo(0,r*4/5-10);
ctx.stroke(); //必須寫(填充方式)
ctx.restore();
}
function drawDot(ctx)
{
ctx.save();
ctx.beginPath(); //必須寫
ctx.translate(width/2,height/2);
ctx.fillStyle="#ffffff";
ctx.arc(0,0,3,0,Math.PI*2);
ctx.fill(); //必須寫(填充方式)
ctx.restore();
}
//定時(shí)器
Timer {
interval: 1000; running: true; repeat: true
onTriggered: canvas.requestPaint();
}
}
利用定時(shí)器實(shí)現(xiàn)動(dòng)態(tài)效果。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于python模擬TCP3次握手連接及發(fā)送數(shù)據(jù)
這篇文章主要介紹了基于python模擬TCP3次握手連接及發(fā)送數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
使用Python生成200個(gè)激活碼的實(shí)現(xiàn)方法
這篇文章主要介紹了使用Python生成200個(gè)激活碼的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
python使用xlrd實(shí)現(xiàn)檢索excel中某列含有指定字符串記錄的方法
這篇文章主要介紹了python使用xlrd實(shí)現(xiàn)檢索excel中某列含有指定字符串記錄的方法,涉及Python使用xlrd模塊檢索Excel的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05
tensorflow 保存模型和取出中間權(quán)重例子
今天小編就為大家分享一篇tensorflow 保存模型和取出中間權(quán)重例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01

