QML实现钟表效果


Posted in Python onJune 02, 2020

Qt5以后的版本,主要加大的对Qt Quick的改进。现实最新的版本可以利用Qt Quick实现很多的绚丽的效果。此里只是利用画布Canvas简单钟表的效果。效果如下:

QML实现钟表效果

源码如下

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();

      //画圆实现
//        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();
  }
  //定时器


  Timer {
       interval: 1000; running: true; repeat: true
       onTriggered: canvas.requestPaint();
     }
}

利用定时器实现动态效果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python pickle模块用法实例分析
May 27 Python
python检查指定文件是否存在的方法
Jul 06 Python
详解Python中open()函数指定文件打开方式的用法
Jun 04 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
Nov 06 Python
对python:print打印时加u的含义详解
Dec 15 Python
Centos7 下安装最新的python3.8
Oct 28 Python
python爬虫爬取笔趣网小说网站过程图解
Nov 18 Python
Python 动态变量名定义与调用方法
Feb 09 Python
详解pandas中iloc, loc和ix的区别和联系
Mar 09 Python
django queryset相加和筛选教程
May 18 Python
Python OrderedDict字典排序方法详解
May 21 Python
python 爬取免费简历模板网站的示例
Sep 27 Python
Pymysql实现往表中插入数据过程解析
Jun 02 #Python
Django全局启用登陆验证login_required的方法
Jun 02 #Python
python爬虫基础知识点整理
Jun 02 #Python
如何理解python面向对象编程
Jun 01 #Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 #Python
matlab、python中矩阵的互相导入导出方式
Jun 01 #Python
如何理解Python中的变量
Jun 01 #Python
You might like
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
PHP内存使用情况如何获取
2015/10/10 PHP
PHP文件上传处理案例分析
2016/10/15 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
2019/03/22 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
js的闭包的一个示例说明
2008/11/18 Javascript
js中将字符串转换成json的三种方式
2011/01/12 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
PHP中CURL的几个经典应用实例
2015/01/23 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
2016/07/24 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
2020/11/17 Vue.js
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
Python简单计算文件夹大小的方法
2015/07/14 Python
python爬虫之百度API调用方法
2017/06/11 Python
详解Python自建logging模块
2018/01/29 Python
selenium+python实现自动化登录的方法
2018/09/04 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
python 统计list中各个元素出现的次数的几种方法
2021/02/20 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
乐观大学生的自我评价
2014/01/10 职场文书
会议活动邀请函
2014/01/27 职场文书
教师先进工作者事迹材料
2014/05/01 职场文书
大学生就业协议书范本(适用于公司企业)
2014/10/07 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
工作经历证明书范文
2014/11/02 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
会议营销主持词
2015/07/03 职场文书
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server