NEWS

新闻

了解openKylin最新资讯,关注社区和产品动态。

NEWS

Learn about the latest news.

【小白课程】openKylin“闹钟”工具的设计与实现原理介绍

2023-11-28 10:00:41

openKylin“闹钟”工具是社区自研的一款操作简易的桌面实用工具,不仅支持设置闹钟,还配置了倒计时和秒表功能,通过界面顶部对应的图标可进行切换,并可在闹钟和计时器中设置不同的铃声提醒。

openKylin“闹钟”工具安装及相关软件包:

$sudo apt install ukui-clock


一、openKylin“闹钟”工具功能介绍

openKylin“闹钟”工具功能包括:闹钟、倒计时和秒表。打开首页菜单选项下拉,选择“帮助”将自动跳转至用户手册,可查看该工具的操作说明。选择“关于”可查看当前版本信息。

1.闹钟

openKylin(开放麒麟)

openKylin(开放麒麟)


  • 点击“添加”可添加闹钟,并设定时间、闹钟名、重复日、铃声及稍后提醒时间。
  • 双击闹钟,可进入编辑闹钟界面。或者右键点击闹钟,可选择“编辑”或者“删除”该闹钟。


2.倒计时

openKylin(开放麒麟)

  • 倒计时设置界面可设定时间和铃声。时间设定可滚动数字盘设置,也可以双击输入数字设定。
  • 点击“开始”进入倒计时运行界面,大滚动盘中显示预计响铃时间和剩余时间。
  • 点击迷你窗口按钮,隐藏闹钟应用,显示迷你窗口。
  • 在迷你窗口中,点击主窗口按钮,可回到闹钟倒计时运行界面。
  • 点击“暂停”,计时暂停。
  • 点击“结束”,计时结束并回到倒计时设置界面。


3.秒表

openKylin(开放麒麟)

  • 秒表可以计时和计次。点击“开始”即开始计时。点击“计次”可记录计次、计次间隔时间,计时不中断。标签分别表示最长和最短的间隔时间记录。
  • 点击“暂停”可记录最终时间。
  • 点击“复位”,清除秒表。


二、openKylin“闹钟”工具实现原理

openKylin“闹钟”工具基于QT实现,主要涉及QTiner类和信号槽机制。所以在讲闹钟工具具体实现之前,简单介绍一下这两个类。


1.QTimer

QTimer类提供了定时器信号和单触发定时器。闹钟到时响铃、倒计时响铃、秒表执行以及秒表的计次间隔都用到了定时器。单触发定时器闹钟没有应用。

操作函数:

  • bool isActive() const 返回定时器运行状态
  • int timerId() const 返回定时器id
  • void setInterval(int msec) 设置定时器间隔(毫秒级别)
  • int setInterval() 返回定时器间隔
  • void start() 开启定时器
  • void stop() 暂停定时器

信号:

  • void timeout() 超时信号


2.信号槽机制

信号槽机制是QT的核心特性。接触过QT的对信号槽应该不陌生,所以这里仅作简单介绍。信号和槽用于多个对象之间的通信,QT的源对象系统是信号和槽实现是基础。

简单使用方法如下:

connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

其中,sender是发射信号的对象的名称,signal()是信号名称。信号可以看做是特殊的函数,需要带括号,有参数时还需要指明参数。receiver是接收信号的对象名称,slot()是槽函数的名称,需要带括号,有参数时还需要指明参数。

最常见适用于GUI界面操作的响应,如QPushButton的按钮点击,发出clicked()信号,关联的槽函数被自动执行。


三、openKylin“闹钟”工具实现方法

openKylin“闹钟”工具功能主要有三部分:闹钟、倒计时和秒表。闹钟界面、闹钟列表和计次列表都是基于QlistWidget实现的自定义封装类。对QT使用者来说,QListWidget操作使用较为简单应该不用再多介绍,其他部分也大多都是界面的绘制和界面操作相关的信号槽,因此下面仅介绍核心实现方法。


1.闹钟

(1)闹钟到时响铃实现原理:

每秒轮询,遍历闹钟对比系统时间看是否到达时间,到达时间响铃。

connect(timer_clock, SIGNAL(timeout()), this, SLOT(timerUpdate()) );
timer_clock->start(1000); //每秒轮询  timerUpdate

(2)稍后提醒实现原理:

响铃提示弹窗的稍后提醒按钮后,稍后提醒定时器启动,每秒轮询时间是否到达,到时后,若通知类型为闹钟且该闹钟存在则重新初始化弹窗和加载铃声。

//稍后提醒的定时connect(timer_xumhuan, SIGNAL(timeout()), this, SLOT(ring()));
timer_xumhuan->setInterval(1000); //每秒轮询ring//稍后提醒响铃

(3)响铃及提示弹窗停留实现原理:

到时闹钟响铃同时启动定时器,设定60s后,关闭弹窗和铃声。

//剩余秒 减1connect(timer, SIGNAL(timeout()), this, SLOT(close_music()));
timer->setInterval(1000); //每秒轮询close_music

(4)判断是否时间到

新建/编辑、删除:闹钟显示界面,使用QlistWidget展示创建的闹钟列表信息。根据操作的闹钟主键ID,进行对应的增删改查操作,并将操作同步到数据库中,同时刷新闹钟列表信息。


2.倒计时

实现原理:点击开始按钮后,启动倒计时定时器,剩余时间减一并更新倒计时剩余时间,时间归零后响铃提示。

//倒计时执行  connect(countdown_timer, SIGNAL(timeout()), this, SLOT(statCountdownMsec()));//设置定时器每个多少毫秒发送一个timeout()信号countdown_timer->setInterval(10);
statCountdownMsec//倒计时执行 剩余时间减一 更新倒计时时间updateCountdownTime 是否时间归零

倒计时暂停/继续:根据暂停/继续状态,对倒计时定时器countdown_timer进行stop()/start()。


3.秒表

秒表实现原理:秒表开启后,开启秒表总定时器,为了秒表的精度问题,设定10毫秒发送一次timeout()信号,并记录秒表总时间。

connect(timer, SIGNAL(timeout()), this, SLOT(CountDown()));/*设置定时器每个多少毫秒发送一个timeout()信号
Set the timer to send a timeout () signal every milliseconds*/timer->setInterval(10);  CountDown//秒表执行 记录秒表总时间

计次间隔原理:间隔时间的记录和秒表执行一样,但是每次计次后清零再计算时间。

//秒表的 每次计次后清零重新计算的时间connect(timer_2, SIGNAL(timeout(), this, SLOT(stopwatchJg()));

以上就是关于openKylin“闹钟”工具实现原理的基本介绍,根据各式各样的用户需求,闹钟的功能仍在不断优化,未来,欢迎更多小伙伴加入,共同完善openKylin“闹钟”工具功能。