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 中__name__ = '__main__' 的作用
Jul 05 Python
python中List的sort方法指南
Sep 01 Python
简单介绍Python的Tornado框架中的协程异步实现原理
Apr 23 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
Apr 05 Python
用Python实现KNN分类算法
Dec 22 Python
python操作excel的方法
Aug 16 Python
Django 对象关系映射(ORM)源码详解
Aug 06 Python
详解Python3定时器任务代码
Sep 23 Python
Django之form组件自动校验数据实现
Jan 14 Python
在spyder IPython console中,运行代码加入参数的实例
Apr 20 Python
关于Theano和Tensorflow多GPU使用问题
Jun 19 Python
使用Python文件读写,自定义分隔符(custom delimiter)
Jul 05 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与XML联手进行网站编程代码实例
2008/07/10 PHP
PHP缓存集成库phpFastCache用法
2014/12/15 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
JQuery 前台切换网站的样式实现
2009/06/22 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
ejs v9 javascript模板系统
2012/03/21 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
Python Requests安装与简单运用
2016/04/07 Python
Python实现简单的四则运算计算器
2016/11/02 Python
Python2中文处理纪要的实现方法
2018/03/10 Python
python reverse反转部分数组的实例
2018/12/13 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
利用pandas向一个csv文件追加写入数据的实现示例
2020/04/23 Python
浅析python 字典嵌套
2020/09/29 Python
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
武汉瑞得软件笔试题
2015/10/27 面试题
舞蹈教育学专业推荐信
2013/11/27 职场文书
乡镇网格化管理实施方案
2014/03/23 职场文书
校优秀毕业生主要事迹
2014/05/26 职场文书
2014年政教处工作总结
2014/12/20 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
敬老院活动感想
2015/08/07 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers