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 str与repr的区别
Mar 23 Python
Python正规则表达式学习指南
Aug 02 Python
python 实现自动远程登陆scp文件实例代码
Mar 13 Python
python引入导入自定义模块和外部文件的实例
Jul 24 Python
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
Jun 26 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
Aug 30 Python
python实现简单俄罗斯方块
Mar 13 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
Apr 01 Python
Pygame的程序开始示例代码
May 07 Python
python中scrapy处理项目数据的实例分析
Nov 22 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服务器实现多session并发运行
2006/10/09 PHP
php中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
php缓冲 output_buffering的使用详解
2013/06/13 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
php自定文件保存session的方法
2014/12/10 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
Yii 实现数据加密和解密
2021/03/09 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
extjs 时间范围选择自动判断的实现代码
2014/06/24 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
2015/03/03 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
JavaScript oncopy事件用法实例解析
2020/05/13 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
Python中的ConfigParser模块使用详解
2015/05/04 Python
Python守护进程用法实例分析
2015/06/04 Python
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
Python绘制的二项分布概率图示例
2018/08/22 Python
使用Python 统计高频字数的方法
2019/01/31 Python
Python之pymysql的使用小结
2019/07/01 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
Python实现仿射密码的思路详解
2020/04/23 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
2020/04/24 Python
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
骨干教师培训制度
2014/01/13 职场文书
学校周年庆活动方案
2014/08/22 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书