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

Posted 等待戈多。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从无到有的基于QT软件的DIY桌面番茄钟(上)相关的知识,希望对你有一定的参考价值。

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

前言

番茄工作法是个不错的方法,本想要从淘宝买一个番茄钟,但发现要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_NAMESPACE

class TomatoClock : public QWidget

    Q_OBJECT

public:
    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_NAMESPACE

class TomatoClock : public QWidget

    Q_OBJECT

public:
    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:00
    timer->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); //时间复位 0
    ui->Timer->display(time.toString("mm:ss"));


void TomatoClock::updateTime()

    //每次更新时间,time增加1
    time = 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桌面番茄钟(上)的主要内容,如果未能解决你的问题,请参考以下文章

[UWP]从头开始创建并发布一个番茄钟

[UWP]从头开始创建并发布一个番茄钟

微信番茄钟小程序

APP案例分析——嘀嗒番茄钟

PSP

时间管理软件哪个最好