[QT]制作软件级屏保

原创 2015年03月10日 16:53:54

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

构造一个屏保类CScreenSaver:

cscreensaver.h文件

#ifndef CSCREENSAVER
#define CSCREENSAVER
 
#ifndef QOBJECT_H
#include <QObject>
#endif
 
class QTimer;
class QLabel;
class CScreenSaver : public QObject
{
    Q_OBJECT
 
public:
    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) {
        //有鼠标或键盘事件则重置timer
        timer->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 屏保设置

简单总结下在嵌入式arm板中设置屏保的方法: 在Qt中有二个QWSScreenSaver类 这个类的定义如下 定义路径qwindowsystem_qws.h class Q...
  • wangxueang224
  • wangxueang224
  • 2012年09月02日 19:32
  • 3853

禁止和恢复屏保

有时候我们的软件在运行中,是不允许进入屏保的,类似暴风影音看电影一样,调用windows api,用几行代码就能搞定。 // 取消屏保 void QClientWindow::StopScreenPr...
  • ypchen001
  • ypchen001
  • 2016年05月21日 15:20
  • 404

QT屏幕保护程序二

前面我们用继承QApplication的方式实现了屏幕保护, 接下了用第二种方式: 首先定义一个屏保类: #ifndef SPLASHSCREEN_H #define SPLASHSCREEN_...
  • cqltbe131421
  • cqltbe131421
  • 2017年08月24日 17:30
  • 348

用Qt写的简单屏保程序

近日老大提别人家产品都有屏保程序,貌似我们也该有,简单在qtcn.org请教了一下,写了个小程序!晕倒,半天没找到上传功能!我已经上传到qtcn上了,地址如下:http://www.qtcn.org/...
  • mociml
  • mociml
  • 2010年03月05日 13:10
  • 2910

WPF中桌面屏保的制作(主要代码)

制作要点:(1) 使用System.Windows.Threading.DispatcherTimer;(2) 将Window属性设置为:      this.WindowState = Window...
  • johnsuna
  • johnsuna
  • 2007年11月21日 17:48
  • 4088

用VB制作屏幕保护程序

用VB制作屏幕保护程序利用Visual Basic 制作屏幕保护程序非常容易。本文将详细给大家介绍制作屏幕保护程序的方法。 ---- 一. 基本编程思路 ---- 大家都知道屏幕保护程序就是利用变换的...
  • firetoucher
  • firetoucher
  • 2001年09月10日 18:53
  • 1349

Linux下屏保程序

http://www.openswc.com/forum.php?mod=viewthread&tid=560 利用一些便捷的小软件把自己的数码相片做成绚烂多彩的屏保,放在自己的电脑上该是多么惬...
  • openswc
  • openswc
  • 2013年06月16日 10:56
  • 2893

winform制作简易屏幕保护工具

效果如下: 具体实现代码如下: using System; using System.Collections.Generic; using System.ComponentModel; ...
  • sheng1522098487
  • sheng1522098487
  • 2017年04月18日 17:41
  • 207

水波纹屏保原理

本文程序的源代码已经在《水波纹屏保程序开源》中开源 这里我将陆续发布一些我自己做的小程序,有些程序可能有点粗糙,希望各位高人多加指点!首先把我今年3月份作的一个程序,拿来晾一下。本程序实现对水波...
  • alleniversoncomputer
  • alleniversoncomputer
  • 2011年11月01日 22:10
  • 1507

QT安装包制作

我们经常用到各种软件, 软件需要从服务器上面下载。下载下来就是一个安装包, 很多人可能也想实现制作一个安装包,给朋友或同事玩玩。 制作安装包需要的下面一些步骤: 1.需要release版本的可执行文...
  • li235456789
  • li235456789
  • 2016年01月20日 22:29
  • 869
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[QT]制作软件级屏保
举报原因:
原因补充:

(最多只允许输入30个字)