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 KMeans聚类问题分析
Feb 23 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
Django用户认证系统 Web请求中的认证解析
Aug 02 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
Aug 05 Python
Python内置加密模块用法解析
Nov 25 Python
python实现随机加减法生成器
Feb 24 Python
django 多数据库及分库实现方式
Apr 01 Python
python实现小程序推送页面收录脚本
Apr 20 Python
使用python+poco+夜神模拟器进行自动化测试实例
Apr 23 Python
Python使用matplotlib绘制圆形代码实例
May 27 Python
python openCV实现摄像头获取人脸图片
Aug 20 Python
pycharm实现猜数游戏
Dec 07 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 smarty模版引擎中的缓存应用
2009/12/11 PHP
php 判断网页是否是utf8编码的方法
2014/06/06 PHP
PHP实现GIF图片验证码
2015/11/04 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
用js调用迅雷下载代码的二种方法
2013/04/15 Javascript
js 通用订单代码
2013/12/23 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
2016/01/12 Javascript
全面接触神奇的Bootstrap导航条实战篇
2016/08/01 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
2018/09/18 Javascript
js最全的数组的降维5种办法(小结)
2020/04/28 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
Python内置的字符串处理函数整理
2013/01/29 Python
python网络编程学习笔记(二):socket建立网络客户端
2014/06/09 Python
Python深入学习之闭包
2014/08/31 Python
python实现查询苹果手机维修进度
2015/03/16 Python
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
python基础教程之分支、循环简单用法
2016/06/16 Python
PyTorch 1.0 正式版已经发布了
2018/12/13 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
在Python中等距取出一个数组其中n个数的实现方式
2019/11/27 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
2020/04/20 Python
Django model class Meta原理解析
2020/11/14 Python
python爬取微博评论的实例讲解
2021/01/15 Python
感恩节活动策划方案
2014/05/16 职场文书
护士工作失误检讨书
2014/09/14 职场文书
行政文员岗位职责
2015/02/04 职场文书
公路施工安全责任书
2015/05/08 职场文书
西游降魔篇观后感
2015/06/15 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers
sql server 累计求和实现代码
2022/02/28 SQL Server
MySQL数据库 任意ip连接方法
2022/05/20 MySQL