美文网首页
qt桌面应用-闹钟提醒

qt桌面应用-闹钟提醒

作者: 技术喵 | 来源:发表于2019-07-08 07:43 被阅读0次

前言

作为非专业业余程序员,天天做电脑面前很累。五一劳动节看了一篇帖子说,劳动时间越长,越放弃思考,为了放松自我,写一个桌面小程序,按时提醒自己休息

设计功能

启动程序开始计时,每50分钟提醒休息10分钟,这样一天8小时,能休息80分钟,想想就开心。
注册开机启动

搭建程序框架

  • 新建项目,使用widget作为主窗口
  • 在widget里嵌入quickWidget作为主界面
  • 创建资源文件,main.qml文件
  • 设置quickWidget的source为main.qml
0_1525653976357_0f62fc29-645d-45f6-9354-d4c6fba283b3-image.png

配置程序图标

在pro里写 RC_FILE += myapp.rc
myapp.rc文件内容

IDI_ICON1               ICON    DISCARDABLE     "logo.ico"
prs1rv5kzujvdn3wtvyo.jpg

背景透明

setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint | Qt::SubWindow | Qt::FramelessWindowHint);

    //背景透明
    setAttribute(Qt::WA_TranslucentBackground);

    //填充背景
    setAutoFillBackground(true);

    //画刷
    QPalette palette;
    QPixmap pixmap("qrc:/toumingBg.png");
    palette.setBrush(QPalette::Window, QBrush(pixmap));
    setPalette(palette);

    //qml透明
    ui->quickWidget->setClearColor(QColor(Qt::transparent));

效果,注意红边框

0_1525656018096_6c0390bf-7149-479c-883a-0f39ffeedda7-image.png

系统托盘

因为程序没有右上角关闭按钮,任务栏图标也去掉了,所以无法关闭程序。因此在系统托盘加个图标,象qq那样,很不错的主意

trayIcon = new QSystemTrayIcon();
    trayIcon->setIcon(QIcon(":/logo.ico"));

    QMenu *menu = new QMenu();
    QAction *action = menu->addAction("退出");
    connect(action, &QAction::triggered, this, &Widget::systemExit);

    trayIcon->setContextMenu(menu);
    trayIcon->show();
0_1525656816896_4e28b28e-df21-4a58-892c-6b0a05f017d9-image.png 0_1525656838166_7c5b8040-475f-4fe1-a89a-d3fd282a126f-image.png

闪烁

正常窗口第一次显示时候会闪现出来,有背景存在所以不会察觉,但是我们的界面是透明,所以第一次闪烁非常非常明显,我没有找到好的方法解决这个问题,投机取巧了一下,效果出奇的好

setFixedSize(1,1);
QTimer::singleShot(1000, this, &Widget::init);

void Widget::init()
{
    setWindowState(Qt::WindowMaximized);
}

全屏黑屏

设置窗口全屏后黑屏,进行下面设置发现不黑屏,原因不明,全屏有毒。。。

void Widget::init()
{
    setWindowState(Qt::WindowMaximized);
    setGeometry(0,0,QApplication::desktop()->width(),QApplication::desktop()->height()+1);
}

接下来终于到了实现业务逻辑的部分了,真不容易。

  • timer实现计时,达到50分钟后显示窗口,黑布下滑遮盖桌面,
  • 动画结束后,timerMin计时10分钟内时间流逝
  • 10分钟过去后,黑布上拉,重新开始timer计时
  • 动画结束,窗口隐藏
   Timer{
        id: timer
        interval: 1000
        repeat: true
        running: true
        onTriggered: {
            var currentDate = new Date

            //秒到达50*60
            if(currentDate-lastDate > workTime*1000){
                widget.show()
                animDown.restart()
            }
        }
    }

   ParallelAnimation{
        id: animDown
        PropertyAnimation{ target: rect; property: "y"; from: -Screen.height; to: 0; easing.type: Easing.Linear; 
        duration: 500}

        onStopped: {
            lastMinDate = new Date

            myTime = myTimeText
            timerMin.restart()
            timer.stop()
        }
    }

    Timer{
        id: timerMin
        interval: 500
        repeat: true
        onTriggered: {
            var currentDate = new Date

            //流逝的时间
            var timeLapse = Math.floor(currentDate-lastMinDate) / 1000

            if(restTime-timeLapse>=0){
                var left = (restTime-timeLapse)

                var min = Number(left/60).toFixed(0)
                var sec = Number(left%60).toFixed(0)

                myTime = addZero(min) + ":" + addZero(sec)

            }
            else{
                lastDate = currentDate
                timerMin.stop()
                animUp.restart()
                timer.restart()
            }
        }
    }

    ParallelAnimation{
        id: animUp
        PropertyAnimation{ target: rect; property: "y"; from: 0; to: -Screen.height; easing.type: Easing.Linear; 
    duration: 500}

        onStopped: {
            widget.hide()
        }
    }

0_1525669493539_f80232ed-59be-4ade-b467-f67b1a9a8d23-image.png

注册开机启动

花了一下午时间,经历了N多坑

  • QSettings设置注册表好简单啊——然并软
  • Win Api有啥方法——RegOpenKeyEx,RegSetValueEx,RegCloseKey
  • 为啥编译失败——该api需要添加lib
  • 为啥windows.h不好用——可能需要qt_windows.h
  • QString咋转LPCWSTR——TEXT()
  • 都写入成功了,为啥看不到——需要添加管理员权限
  • 普通注册表为啥写入乱码啊,unicode编码转成ANSI编码再转LPBYTE
  • 值终于对了,应用名怎么只剩一个字母了——QString转LPCSTR
  • 开机启动写成功了,注册表怎么还没有——开机启动项有就行了
0_1525694527486_QQ截图20180507183633.png

福利

源代码下载
程序包下载,把bin文件夹下载下来哦

第二天

注册开机启动,QSettings其实好用,

void Widget::autoRun(bool run)
{
    QString path = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";

    QString exePath = QApplication::applicationFilePath();
    exePath = exePath.replace("/", "\\");

    QSettings *reg = new QSettings(path, QSettings::NativeFormat);

    if(run){
        reg->setValue("rest", exePath);
    }
    else{
        reg->setValue("rest", "");
    }
}
0_1525738087123_f7d2d4fb-f454-4eb4-84a3-3bae1b400a45-image.png

总结

qt下修改注册表,推荐用QSettings,很方便

  • 64位系统有重定向问题,真正的默认开机启动项在
    HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
0_1525738661800_33a3c92d-0121-419c-9cb3-169705f82bba-image.png

相关文章

  • qt桌面应用-闹钟提醒

    前言 作为非专业业余程序员,天天做电脑面前很累。五一劳动节看了一篇帖子说,劳动时间越长,越放弃思考,为了放松自我,...

  • Electron跨平台桌面级应用开发框架

    上次我们提到了业界大名鼎鼎的Qt桌面级应用开发框架,不过Qt是基于c++进行开发的,c++的开发模式也并不是十分适...

  • Qt实现HTTP表单提交

    Qt是一款跨平台的C++图形用户界面应用程序开发框架。就是可以拿它来开发桌面端程序。接触Qt已经是六年前的事情了,...

  • 音乐桌面

    用桌面听歌 基于Qt Demo 【spectrum】,结合桌面壁纸效果,能够识别WAV格式的歌曲,在桌面描绘频谱方...

  • Linux下Clang交叉编译protobuffer库供Qt o

    缘由 笔者在一个由Qt开发的桌面应用程序中,使用到了protobuffer消息传输协议,而今需要移植到安卓手机上,...

  • 记 QT 应用开发中的一个二进制兼容性问题

    笔者在参与开发一个集成了 QT 的跨平台桌面应用程序,目标平台是 Windows 和 Mac。一段时间以来,运行 ...

  • 调闹钟提醒

    做一件事如何一直坚持下去?如同刷牙洗脸一样,每天都必须做,又不会忘记的,天天睡觉前或者睡醒后,条件反射地习惯...

  • Linux下打包发布Qt应用程序

    Linux下打包发布Qt应用程序 Linux下打包发布Qt应用程序 Linux下使用Qt进行开发的程序,如果想要在...

  • QT - Qt Quick编程入门

    Qt Quick编程入门 基于警报应用程序的Qt Quick教程。 本教程介绍如何开发简单的警报应用程序作为Qt ...

  • 2020-08-03 手动编译Qt库(msvc2019版本)

    Qt Windows exe应用程序部署指南:https://doc.qt.io/qt-5/windows-dep...

网友评论

      本文标题:qt桌面应用-闹钟提醒

      本文链接:https://www.haomeiwen.com/subject/yvhihctx.html