基于QT软件的DIY桌面番茄钟-上篇

  • 前言
    • 参考本教程(上篇)可实现的功能:
  • 实现细节:
    • Day 1:
      • 需求导图:
      • QT的安装:
    • Day 2:
      • 创建项目:
      • 构建无边框界面(后续可添加缩放功能,未添加)
      • 增加透明度界面,新增单击界面改变界面透明度(后续统计第几个番茄钟决定用透明度来统计)
      • 代码展示:
    • Day 3:
      • 计时器的实现
      • 参考代码:

前言

番茄工作法是个不错的方法,本想要从淘宝买一个番茄钟,但发现要99块钱,太贵了。尝试自制一个基于Windows的桌面悬浮番茄钟。

经过一番搜索,决定采用Qt方式进行DIY。计划用一周的时间进行DIY,并给出具体的实现细节。

参考本教程(上篇)可实现的功能:

  • 计时器功能及界面变色功能:番茄钟25min(红色),休息5min(绿色)。
  • 暂停功能:单击实现暂停与恢复暂停。

  • 置顶功能,始终置于其它窗体上面,避免被遮挡。

后续更多功能及扩展将在**从无到有的基于QT软件的DIY桌面番茄钟(2)**中添加。具体可执行文件将在功能完全扩展后发出,需要目前的beta版本的可执行文件可在评论区留言。

实现细节:

Day 1:

需求导图:

QT的安装:

QT官网
首先从Qt官网下载开源安装包,之后进行安装:
需要首先进行注册登录,之后进入到如下步骤

选择如下安装即可,

进入到下载页面,静静等待,

Day 2:

创建项目:


创建完后如下:

创建完成后,有如下文件

  • Header Files

    • tomatoclock.h
  • Source Files
    • main.cpp
    • tomatoclock.cpp

Header Files: 用于放头文件,所有.h的声明都放在这里。
Source Files: 放源文件,所有.c,.cpp的程序实现的代码都放这里。
Resource Files: 所有的资源文件,如图标,图片,菜单,文字之类的文件都放这里。

头文件(header files)又称作预编译文件,是用户应用程序和函数库之间的桥梁和纽带。作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明,而定义文件用于保存程序的实现。

头文件的主要作用在于调用库功能,对各个被调用函数给出一个描述,其本身不包含程序的逻辑实现代码,它只起描述性作用,告诉应用程序通过相应途径寻找相应功能函数的真正逻辑实现代码。用户程序只需要按照头文件中的接口声明来调用库功能,编译器会从库中提取相应的代码。

简单的说,头文件就是作者告诉程序从哪调用库函数的文件。

构建无边框界面(后续可添加缩放功能,未添加)

构建了一个无边框的界面,增加番茄钟的美观图,如图所示:

增加透明度界面,新增单击界面改变界面透明度(后续统计第几个番茄钟决定用透明度来统计)

代码展示:

tomatoclock.h

#ifndef TOMATOCLOCK_H
#define TOMATOCLOCK_H#include <QWidget>
#include <windows.h>
#include <windowsx.h>
#include <QMouseEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class TomatoClock; }
QT_END_NAMESPACEclass TomatoClock : public QWidget
{Q_OBJECTpublic:TomatoClock(QWidget *parent = nullptr);~TomatoClock();
protected:
//     声明一些函数void mousePressEvent(QMouseEvent *e); //鼠标单击事件void mouseMoveEvent(QMouseEvent *e); // 鼠标单击拖动窗口
private:int boundaryWidth;float Opacity;QPoint clickPos;Ui::TomatoClock *ui;
};
#endif // TOMATOCLOCK_H

main.cpp

#include "tomatoclock.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);TomatoClock w;w.show();return a.exec();
}

tomatoclock.cpp

#include "tomatoclock.h"
#include "./ui_tomatoclock.h"TomatoClock::TomatoClock(QWidget *parent): QWidget(parent), ui(new Ui::TomatoClock)
{ui->setupUi(this);boundaryWidth=4;                                    //设置触发resize的宽度Opacity = 1.0;this->setWindowFlags(Qt::FramelessWindowHint);      //设置为无边框窗口this->setMinimumSize(45,45);                        //设置最小尺寸this->setStyleSheet("background:#D1EEEE");          //设置背景颜色this->setWindowOpacity(Opacity);                    //设置不透明度}
TomatoClock::~TomatoClock()
{delete ui;
}void TomatoClock::mousePressEvent(QMouseEvent *e)
{if(e->button()==Qt::LeftButton)clickPos=e->pos();Opacity = 0.5;this->setWindowOpacity(Opacity);
}
void TomatoClock::mouseMoveEvent(QMouseEvent *e)
{if(e->buttons()&Qt::LeftButton)move(e->pos()+pos()-clickPos); //父窗口的左上角+当前鼠标指针移动-初始单击时候鼠标指针的方向
}//void move(const QPoint &);
//其中move的原点是父窗口的左上角,  如果没有父窗口,则桌面即为父窗口

Day 3:

计时器的实现

  • 实现计时器功能及计时器初始化以及暂停功能。通过单击窗体实现暂停及恢复暂停。
  • 增加一些界面美化功能,包括单击窗体界面变色以及番茄钟期间和休息期间界面不同颜色。
  • 增加置顶功能,始终置于其它窗体上面,避免被遮挡。

具体示例参考Gif图:

  • 计时器功能及界面变色功能:
  • 暂停功能:

参考代码:

tomatoclock.h

#ifndef TOMATOCLOCK_H
#define TOMATOCLOCK_H#include <QWidget>
#include <windows.h>
#include <windowsx.h>
#include <QMouseEvent>
#include <QTimer>
#include <QTime>
QT_BEGIN_NAMESPACE
namespace Ui { class TomatoClock; }
QT_END_NAMESPACEclass TomatoClock : public QWidget
{Q_OBJECTpublic:TomatoClock(QWidget *parent = nullptr);~TomatoClock();protected:
//     声明一些函数void mousePressEvent(QMouseEvent *e); //鼠标单击事件void mouseMoveEvent(QMouseEvent *e); // 鼠标单击拖动窗口private slots:void initTime(); //初始化时间void updateTime(); //更新时间
private:float Opacity; //透明度控制int state; //用于暂停和恢复暂停int tomato_num; //番茄钟计数QString current_color;QPoint clickPos;Ui::TomatoClock *ui;QTimer *timer;QTime time;};
#endif // TOMATOCLOCK_H

main.cpp

#include "tomatoclock.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);TomatoClock w;w.show();return a.exec();
}

tomatoclock.cpp

#include "tomatoclock.h"
#include "./ui_tomatoclock.h"TomatoClock::TomatoClock(QWidget *parent): QWidget(parent), ui(new Ui::TomatoClock)
{ui->setupUi(this);Opacity = 0.8; // 透明度设置state = 1;   // 暂停,恢复暂停tomato_num = 0; //番茄钟计数current_color = "background:#CD9B9B"; //当前背景色设置this->setStyleSheet(current_color);                 //设置背景颜色this->setWindowFlags(Qt::FramelessWindowHint);      //设置为无边框窗口
//    this->setMinimumSize(100,50);                        //设置最小尺寸
//    this->setMaximumSize(200,100);                      //设置最大尺寸this->setWindowOpacity(Opacity);                    //设置不透明度// 置顶::SetWindowPos(HWND(this->winId()), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
//    // 不置顶
//    ::SetWindowPos(HWND(this->winId()), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);timer = new QTimer;ui->Timer->setDigitCount(5);                    //设置显示位数为8位initTime();                                      //令LCD显示00:00:00timer->setInterval(1000);                        //设置定时器间隔为1000=1s//连接槽函数,将timer的timeout行为,连接到updateTime函数中connect(timer, SIGNAL(timeout()), this, SLOT(updateTime()));//当点击(clicked)pbStart时,调用函数pbStart_clicked//connect(ui->pbStart, SIGNAL(clicked()), this, SLOT(pbStart_clicked()));timer->start();  //启用定时器}
TomatoClock::~TomatoClock()
{delete ui;
}void TomatoClock::mousePressEvent(QMouseEvent *e)  //鼠标单击事件
{if(e->button()==Qt::LeftButton)clickPos=e->pos();this->setWindowOpacity(Opacity);if (state == 1){//暂停state = 0;this->setStyleSheet("background:#B5B5B5");    //设置暂停背景颜色Opacity = 0.2;timer->stop();this->setWindowOpacity(Opacity);                    //设置不透明度}else{//恢复state = 1;timer->start();this->setStyleSheet( current_color);          //恢复背景颜色Opacity = 0.8;}this->setWindowOpacity(Opacity);                    //设置不透明度
}
void TomatoClock::mouseMoveEvent(QMouseEvent *e)  //鼠标移动事件
{if(e->buttons()&Qt::LeftButton)move(e->pos()+pos()-clickPos); //父窗口的左上角+当前鼠标指针移动-初始单击时候鼠标指针的方向
}//void move(const QPoint &);
//其中move的原点是父窗口的左上角,  如果没有父窗口,则桌面即为父窗口void TomatoClock::initTime()
{time.setHMS(0,0,0); //时间复位 0ui->Timer->display(time.toString("mm:ss"));
}void TomatoClock::updateTime()
{//每次更新时间,time增加1time = time.addSecs(1);ui->Timer->display(time.toString("mm:ss"));if (time.minute() == 5 and tomato_num==1){//休息完毕,进入番茄钟tomato_num = 0;initTime();current_color = "background:#CD9B9B";this->setStyleSheet(current_color);    //进入番茄色}else if(time.minute() == 25){//番茄钟完毕,进入休息时间tomato_num = 1;initTime();current_color = "background:#9BCD9B";this->setStyleSheet(current_color);    //进入休息色}
}

tomatoclock.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>TomatoClock</class><widget class="QWidget" name="TomatoClock"><property name="enabled"><bool>true</bool></property><property name="geometry"><rect><x>0</x><y>0</y><width>211</width><height>101</height></rect></property><property name="windowTitle"><string>TomatoClock</string></property><widget class="QLCDNumber" name="Timer"><property name="geometry"><rect><x>20</x><y>10</y><width>171</width><height>81</height></rect></property></widget></widget><resources/><connections/>
</ui>

具体ui窗体设计(注意命名的变化):

从无到有的基于QT软件的DIY桌面番茄钟(上)相关推荐

  1. 基于Qt的Windows平台桌面蓝牙调试器软件

    基于Qt的Windows平台桌面蓝牙调试器软件 在进行嵌入式的调试时,我们经常需要下位机给主机打印数据来观察数据变化.绘制波形等进行调试.一般的做法可以是直接通过串口与PC进行数据通信(USB to ...

  2. 基于QT ffmpeg的动态桌面壁纸

    基于QT ffmpeg的动态桌面壁纸 目前制作了一个基于QT ffmpeg的动态桌面壁纸,源码程序在github上 下面为链接: 动态壁纸软件 项目名为 DesktopDynamicWallpaper ...

  3. 基于Qt的QSplashScreen实现桌面水印,在windows下置顶失效解决办法

    基于Qt的QSplashScreen实现桌面水印,但在windows下重复关闭启动水印程序后会出现置顶失效的现象 现象:通过线程启动-关闭-再启动水印操作后,水印程序会出现置顶失效的问题 解决方案:调 ...

  4. [DIY]基于RT-Thread的辉光管语音番茄钟

    优先查看语雀,后面也会优先更新语雀 前期规划 能用国产就先用国产. 两个带小数点的IN12辉光管,可插拔设计,坏了方便换. 三路TYPE-C直插供电,可以在背后插也可以在侧面插. 支持WIFI对时,使 ...

  5. 基于微信小程序的todo番茄钟设计与实现源码

    关注公众号,公众号内回复1001获取下载链接 1.需求 设计微信小程序实现todo番茄钟功能,支持任务计划导入,时间设定,微信消息提醒等功能 2.功能展示

  6. QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(一)

    QT软件开发-基于FFMPEG设计录屏与rtsp.rtmp推流软件(支持桌面与摄像头)(一) https://xiaolong.blog.csdn.net/article/details/126954 ...

  7. QT软件开发-基于FFMPEG设计录屏与rtsp、rtmp推流软件(支持桌面与摄像头)(四)

    QT软件开发-基于FFMPEG设计录屏与rtsp.rtmp推流软件(支持桌面与摄像头)(一) https://xiaolong.blog.csdn.net/article/details/126954 ...

  8. 基于Qt Designer和PyQt5的桌面软件开发--环境搭建和入门例子

      本文介绍了如何使用技术栈PyCharm+Qt Designer+PyQt5来开发桌面软件,从环境搭建.例子演示到对容易混淆概念的解释.文中用到的全部软件+代码下载链接为:https://url39 ...

  9. 基于Qt的桌面客户端组件化框架DT 开源啦

    这个是本人在工作中基于QT开发的组件化桌面开发框架,目前打算开源出来提供给大家,节省大家的开发时间和效率,希望对大家的开发有所帮助,也欢迎提出意见和改进建议 1. 为什么开源DT框架 DT框架,本身就 ...

最新文章

  1. mac mysql启动问题
  2. transform插件
  3. 8、HTML <table>标签(表格)
  4. Python学习笔记:面向对象编程(4)
  5. git分支(branch)操作相关命令
  6. Maven精选系列--依赖范围、传递、排除
  7. python的excel库_Python-Excel 模块哪家强?
  8. java中printreader类_Java基本字符流输入输出类的使用
  9. 鱼骨图分析法实际案例_8D根本原因分析——5WHY与鱼骨图培训课件(PPT64完整详细)...
  10. rsync 错误排除与修复
  11. vue导出excel文件损坏
  12. 计算机桌面输入法怎么恢复,电脑桌面系统输入法不见了?输入法不见了找回方法/步骤...
  13. 网易免费企业邮箱找回密码(翻山越岭)
  14. 创建镜像问题出现的错误
  15. 2010年IT十大人物猜想
  16. RabbitMQ系列【8】消息可靠性之ACK机制
  17. DPad down是哪个键_上海crm系统哪个好_仓库erp管理
  18. 详细讲解如何映射网络驱动器
  19. 手把手教你win10下安装Anaconda
  20. visifire  柱状图控件

热门文章

  1. 暨 广告、推荐、搜索 三大顶级复杂业务之 “广告业务系统详叙”
  2. InterView一个靠谱的iOS开发
  3. 课堂笔记(7) Model fit and variable selection 模型拟合和变量选择 —— Adjusted ​R^2、Cp、全子集回归
  4. 用R中的包实现逐步回归
  5. LCD背光贴合机及其控制系统
  6. Android stutio实现飞机大战
  7. Config 分布式配置中心
  8. nagios是什么_什么是Nagios?
  9. 【VMWare】xp 虚拟机安装用友U872
  10. vue element-ui导出表格的功能,csv文件格式