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中使用logging模块代替print(logging简明指南)
Jul 09 Python
python使用wmi模块获取windows下硬盘信息的方法
May 15 Python
Python入门之三角函数atan2()函数详解
Nov 08 Python
Python面向对象总结及类与正则表达式详解
Apr 18 Python
python 多线程对post请求服务器测试并发的方法
Jun 13 Python
Numpy之将矩阵拉成向量的实例
Nov 30 Python
Pytorch提取模型特征向量保存至csv的例子
Jan 03 Python
Pycharm激活方法及详细教程(详细且实用)
May 12 Python
keras load model时出现Missing Layer错误的解决方式
Jun 11 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
Nov 25 Python
Python自动化爬取天眼查数据的实现
Jun 15 Python
Python尝试实现蒙特卡罗模拟期权定价
Apr 21 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
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
PHP 简单数组排序实现代码
2009/08/05 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
JQuery UI皮肤定制
2009/07/27 Javascript
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
浅谈jQuery hover(over, out)事件函数
2016/12/03 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
React中上传图片到七牛的示例代码
2017/10/10 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
2019/02/28 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
2019/08/20 Javascript
通过vue写一个瀑布流插件代码实例
2019/09/07 Javascript
纯JS实现五子棋游戏
2020/05/28 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
深入解读Python解析XML的几种方式
2016/02/16 Python
Python登录注册验证功能实现
2018/06/18 Python
浅析Python函数式编程
2018/10/06 Python
Flask框架搭建虚拟环境的步骤分析
2019/12/21 Python
Python实现计算长方形面积(带参数函数demo)
2020/01/18 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
2020/03/02 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
C#笔试题集合
2013/06/21 面试题
送给程序员的20个Java集合面试问题
2014/08/06 面试题
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
晋江市人民政府党组群众路线教育实践活动整改方案
2014/10/25 职场文书
故意杀人罪辩护词
2015/05/21 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
对Keras自带Loss Function的深入研究
2021/05/25 Python
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS