[QT]制作软件级屏保

欢迎访问cuzn小站

之前接手的项目中有一个关于屏保的需求是,如果超过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();
}
时间: 2024-10-08 12:26:31

[QT]制作软件级屏保的相关文章

动态苹果屏保壁纸软件Brooklyn Mac免费版

Brooklyn Mac免费版是专为mac用户制作的动态苹果屏保壁纸软件,它的设计灵感来自去年 10 月份的苹果发布会,多彩绚丽的苹果 Logo 至今让人印象深刻.不仅为您带来视觉上的享受,还能不增加电脑内的硬件负担. Brooklyn for Mac版安装教程 Brooklyn屏保下载完成后打开,双击[Brooklyn.saver]进行安装. 弹出Brooklyn安装提示,点击[安装]. 安装完成,可以在屏幕保护程序中找到Brooklyn. 说起「屏保」,大家应该都不陌生,因为很多人曾经都用过

手机屏保临摹制作中遇到的问题

手机屏保临摹,在制作工程中本来使用AI制作了一个图标就是中间圆形的那个种表的样式,可是用AI 制作完成以后保存为EPS格式以后,再一次通过PS打开发现制作的内容不在了变为了一个圆形的白圈,后来有试了几次,还是出现了这个问题,但是在AI中我尝试加了个方形的底色进行保存EPS格式在用PS 打开制作的白图标在的但是无法分离,经过这一个事情我总结出来,全白的AI图标保存为EPS格式再一次被PS打开会变为一片白色,如何解决这个问题呢请指教,谢谢.

自己制作精美的App Store 软件截屏

当用户搜索到App的时候,一般都会先看截图,如果截图效果不好,可能用户就不会下载. 不想自己辛苦写的认为还不错的软件,因为截图的原因,而降低了很多下载量吧. 轻轻松松做出这样高大上的截屏效果来. Screenshot Maker Pro (iOS – Free to Try) Promotee (OSX – $4.99 USD) PlaceIt (Website – Free/Paid) Adobe Photoshop CC (OSX/PC – Free Trial/$9.99-$19.99 p

制作屏保,图片的移动

public partial class ImageMove : Form    {        public ImageMove()        {            InitializeComponent();        } int x = 1;//x为1代表水平向右移动,-1代表水平向左移动        int y = 1;//y为1代表垂直向下移动,-1代表垂直向上移动        int move = 5;//每次移动的距离,水平和垂直都是一样的        priv

屏保文件scr文件制作方法

公司要求要做一个专题屏保,在域服务器推送: 思路是做个PPT,然后PPT转换成WMV格式,WMV格式再转换成.SCR格式的屏保文件 office2010的PPT可以另存为WMV,然后经过"Screensaver Factory"软件转换成.scr文件,发布后发现 部分用户(电脑配置很差)的屏保运行花屏,猜测由于文件过大导致,改成2.5M的文件,还是花屏. 怀疑是软件选择的问题,经过搜索找到一款软件"PowerPoint Slide Show Converter"运行

用Qt写软件系列五:一个安全防护软件的制作(1)

引言 又有许久没有更新了.Qt,我心爱的Qt,为了找工作不得不抛弃一段时间,业余时间来学一学了.本来计划要写一系列关于Qt组件美化的博文,但是写了几篇之后就没坚持下去了.技术上倒是问题不大,主要是时间不够充裕.这段时间写几篇关于界面整体设计的博文,从最基础的界面元素开始,到最后构建一个页面元素丰富的桌面应用程序.Trojan Assessment Platform是一个原型设计项目,只是实现了有限的一部分功能.远远还称不上是一个评估平台.这里仅仅侧重于用Qt做界面的实现. 界面预览 首先还是看看

三个屏保软件

虽然液晶屏幕不再需要屏保了, 但有时候为了防止别人乱动电脑, 看起来也不错, 起码还能看表. 1. Padbury Clock 支持黑白主题, 可选是否24小时制, 是否显示分隔符等, 配置项比较全 效果比较满意: ? 2. FlipClock 配置项比较少, 有分页的效果, 但是不会显示分隔符, 看起来有点怪 ? 3. Fliqlo? 以前在windows下常用的一个, 看起来也不错. 可以配置12/24小时制, 而且可以调大小 有翻页效果, 但不会显示秒 比较下来, 还是觉得第一个好一点.

少女时代擦玻璃屏保

自己制作的韩国少女时代美女擦玻璃屏保希望大家喜欢.(抱歉只支持XP系统) 下载地址

用Qt制作的Android独立游戏《吃药了》发布

一个多月的努力终于有了回报,我自己研究制作的独立游戏<吃药了>,终于在360应用商店上线了. 这一款游戏呢,使用的是Qt开发的.其实开发这款简单的应用之前,我经历了端游和页游,但是对手游开发了解甚少.不过今年5月20日,Qt官方发布了Qt5.3,对Android和iOS的支持变得成熟起来了,于是我打算冒一个险,使用大家从未使用过的Qt来开发手机游戏.这一个月呢,各种心酸各种泪,我曾经感受到整天10多个小时开发的疲惫:我曾经感受到家人的种种催促:我曾经感受到同事们的好言相劝:我曾经感受到自己内心