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 相关文章推荐
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 Python
Python中列表和元组的相关语句和方法讲解
Aug 20 Python
使用Python对SQLite数据库操作
Apr 06 Python
利用python求解物理学中的双弹簧质能系统详解
Sep 29 Python
numpy的文件存储.npy .npz 文件详解
Jul 09 Python
Python异常处理操作实例详解
Aug 28 Python
Python实现的拉格朗日插值法示例
Jan 08 Python
使用pickle存储数据dump 和 load实例讲解
Dec 30 Python
Python如何解除一个装饰器
Aug 07 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 Python
pytorch中[..., 0]的用法说明
May 20 Python
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
May 31 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接收POST数据,解析json数据
2013/06/28 PHP
PHP连接局域网MYSQL数据库的简单实例
2013/08/26 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
javascript 获取图片颜色
2009/04/05 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
jQuery基于排序功能实现上移、下移的方法
2016/11/26 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
Vue自定义事件(详解)
2017/08/19 Javascript
javaScript之split与join的区别(详解)
2017/11/08 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
[02:36]DOTA2上海特锦赛 回忆电竞生涯的重要瞬间
2016/03/25 DOTA
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
Python字符串格式化输出方法分析
2016/04/13 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
2018/09/17 Python
python调用webservice接口的实现
2019/07/12 Python
wxPython实现分隔窗口
2019/11/19 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
法国房车租赁网站:Yescapa
2019/08/26 全球购物
优秀毕业生自荐信范文
2014/01/01 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
先进个人申报材料
2014/12/30 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
在校学生证明格式
2015/06/24 职场文书
国际贸易实训总结
2015/08/03 职场文书