之前接手的项目中有一个关于屏保的需求是,如果超过30s未进行操作,软件自动进入屏保状态。简单分析一下:所谓未进行操作即是指未接收到键盘或者鼠标事件,超过30s也就是需要用到定时器,屏保状态就是显示一张全屏大图。从QT的角度思考,我们需要创建一个屏保类并且将其做为应用程序的一个事件代理,如果其中有鼠标或者键盘事件,则重新刷新定时器,如果超过30s没有接收到相关事件则全屏显示屏保窗口。以下就着代码实例讲解一下。

构造一个屏保类CScreenSaver:

cscreensaver.h文件

#ifndef CSCREENSAVER
#define CSCREENSAVER#ifndef QOBJECT_H
#include <QObject>
#endifclass QTimer;
class QLabel;
class CScreenSaver : public QObject
{Q_OBJECTpublic:CScreenSaver(QObject *parent = NULL);~CScreenSaver();protected slots:void slot_timeout();protected://初始化屏保参数void init();//事件接收处理函数,由installEventFilter调用方在接收到事件时调用bool eventFilter(QObject *watched, QEvent *event);private://定时器QTimer   *timer;//用于显示屏保图片的对象QLabel   *label;//初始屏保等待超时时间static const unsigned WAIT_TIME = 30000;
};#endif

cscreensaver.cpp文件

#include <cscreensaver.h>#include <QFile>
#include <QLabel>
#include <QEvent>
#include <QTimer>
#include <QPixmap>
#include <QSettings>CScreenSaver::CScreenSaver(QObject *parent): QObject(parent), waitInterval(WAIT_TIME)
{init();
}CScreenSaver::~CScreenSaver()
{
}void CScreenSaver::init()
{unsigned waitInterval;QString urlPath;//读取屏保配置QSettings settings(QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat);settings.beginGroup("SCREENSAVER");if (settings.contains("Interval")){bool ok;waitInterval = settings.value("Interval").toUInt(&ok);if (!ok)waitInterval = WAIT_TIME;}if (settings.contains("PicPath")){urlPath = settings.value("PicPath").toString();}settings.endGroup();//设置并启动timer。如果超过30s,则一直显示屏保并不再触发直到再次刷新定时器timer = new QTimer;timer->setSingleShot(true);connect(timer, SIGNAL(timeout()), this, SLOT(slot_timeout()));timer->start(waitInterval);//屏保窗口QRect screenRect = QApplication::​desktop()->screenGeometry(0);label = new QLabel();label->setGeometry(screenRect);label->setWindowFlags(Qt::FramelessWindowHint);//拉伸背景图片label->setScaledContents(true);QPixmap pmp;pmp.load(urlPath);label->setPixmap(pmp);label->hide();
}bool CScreenSaver::eventFilter(QObject *obj, QEvent *event)
{//判断事件类型if (event->type() == QEvent::KeyPress || event->type() == QEvent::MouseMove|| event->type() == QEvent::MouseButtonPress) {//有鼠标或键盘事件则重置timertimer->start();label->hide();}return QObject::eventFilter(obj, event);
}void CScreenSaver::slot_timeout()
{//显示屏保label->activateWindow();label->show();
}

main.cpp文件中

#include <QApplication>...
#include <cscreensaver.h>int main(int argc, char *argv[])
{QApplication app(argc, argv);...CScreenSaver screenSaver;//全局接收并委托处理事件app.installEventFilter(&screenSaver);...return app.exec();
}

欢迎访问cuzn小站

[QT]制作软件级屏保相关推荐

  1. QT制作软件---窗口跟随鼠标进行移动

    书接上文,在QT制作软件-去除系统自带的Dialog边框这篇博客中,我们提到了,如果移除系统自带的Dialog窗口会出现当前创建的窗口,无法拖动的情况.即如下图所示: 图1 解决方法:(原理) 要拖动 ...

  2. QT 制作 gif 录屏 小工具

    一.说明: 不断地截取 选中的区域,然后将其制作成 gif 动图. 二.效果图: 1.可设置要录制屏幕的宽高,支持右下角直接拉动改变. 2.可设置变宽的宽度 3.可设置录屏控件的背景颜色 4.可设置录 ...

  3. java做windows屏保_java编程加载窗口,制作动画(屏保泡泡)

    1.整体的结构图: 2.编写GameFrame02.java代码: package cn.bjsxt.test; import java.awt.Frame; import java.awt.Grap ...

  4. 3D屏保JAVA代码_java编程加载窗口,制作动画(屏保泡泡)

    1.整体的结构图: 2.编写GameFrame02.java代码: package cn.bjsxt.test; import java.awt.Frame; import java.awt.Grap ...

  5. java编程加载窗口,制作动画(屏保泡泡)

    1.整体的结构图: 2.编写GameFrame02.java代码: package cn.bjsxt.test;import java.awt.Frame; import java.awt.Graph ...

  6. 在Windows XP中制作屏保

    在Windows XP中增加了许多个性化设置,就说它的屏保吧,也不再像Win9x那样死板,利用Windows XP的屏保程序我们可以自己制作个性化的屏保,不信请跟我来. id="ad_top ...

  7. QT制作的软件全屏显示后最小化,点击任务栏图标打开时不是全屏

    QT制作的软件全屏显示后最小化,点击任务栏图标打开时不是全屏 前言 用QT做了一个小软件,把它自带的窗口栏给屏蔽了自己搞了关闭和最小化的按钮,且软件打开是全屏显示的.如今遇到的问题是,打开软件全屏显示 ...

  8. 罗盘时钟制作代码_抖音八卦时钟手机屏保设置方法!

    声明:部分内容来源网络 抖音时钟数字罗盘屏保最近十分的火爆, 看上去很有意思也很有趣, 很多人都想要弄. 而抖音时钟数字罗盘屏保如何设置? 今天小编就教大家如何30秒内搞定 其实这个非常的简单, 只要 ...

  9. flash设置屏保 html,用Flash制作屏保-FlashWiz

    当朋友们在网上漫步时,看到那些丰富多采的Flash(动画)时,会不会眼馋?会不会心动?会不会想把它们作为屏幕保护程序来一饱眼福呢?在这里介绍一个把Flash制作成屏幕保护的程序-FlashWiz.Fl ...

最新文章

  1. Linux下tar.xz压缩解压
  2. UA SIE545 优化理论基础0 优化建模3 线性回归的参数估计问题
  3. pandas 中有关isin()函数的介绍,python中del解释
  4. 早上起床时需要的重力
  5. Android开发常用工具推荐
  6. 替代方法_替代化石燃料 科学家找到细菌生产塑料原料的新方法
  7. 单因素方差分析[转载]
  8. type=file的未选择任何文件修改_Excel基础—文件菜单之创建保存
  9. pycharm操作指北
  10. 前端----HTML
  11. [ZT]IBM骨灰心得:在你决定购买IBM某个系列前你认真思考过这些吗?
  12. 内网集群 无法通信_IPSEC连接成功,内网之间却无法互相通信。
  13. java基础巩固-宇宙第一AiYWM:为了维持生计,单例模式阅读总结【单例模式不同写法、在JDK中的应用】~整起
  14. 建立牢固的多功能Smartphone应用程序
  15. 数据结构-----------------------哈希表(最通俗易懂的文章)
  16. IDEA如何创建带有 webapp 目录的 maven 项目
  17. 解析单总线协议(1-wire)
  18. Excel,sumproduct()函数怎么用
  19. ClickHouse的Projection特性在快手的应用
  20. php两个数组之间去重,php数组去重、魔术方法、redis常用数据结构及应用场景

热门文章

  1. JVM bat常见面试题
  2. 一键重装系统win10超详细教程
  3. 电路设计--驱动放大电路设计
  4. Hype Cycle (技术成熟度曲线)
  5. 腾讯云服务器如何手动搭建LAMP环境?
  6. c语言实现分治法求第K大元素(详细解释)
  7. vue实现点击标题,显示隐藏兄弟元素(类似电脑打印设备显示打印设备)
  8. Node.js_assert
  9. 如何全面提升你的气质
  10. 总结1-mysql—JDBC-Servlet