您的位置:首页 > 编程语言 > Qt开发

Qt实现屏保功能,鼠标一定时间无响应程序进入待机状态

2018-02-06 10:49 691 查看
最近使用Qt实现类似与屏保的功能,当鼠标在一定时间内一直停留在一个位置的时候,程序会自动切入到其他界面(用于显示一些信息),当鼠标移动的时候,屏幕切换回来,效果类似于屏幕保护。

实现想法如下:

想法一:

继承QApplication类,重写

bool Application::notify(QObject *obj, QEvent *e)

函数,获取QEvent,如果是鼠标移动事件,就将定时器停止,否则就启动定时器,当定时器到达一定时间的时候,触发槽事件,切换屏幕。

在启动定时器的时候要注意,首先要判断定时器是否已经启动了,如果已经启动了,就不要重复启动了。

还需要定义一个函数

void Application::setWindowInstance(FullScreenWindow *wnd)

在main.cpp里面将定义的窗体传进来,这样就能对窗体进行操作了,并且可以绑定信号和槽了,在这里我的槽函数是在窗体的cpp里面实现的。

代码如下:

main.cpp

[cpp] view
plain copy

#include <QtGui/QApplication>  

#include "fullscreenwindow.h"  

#include "application.h"  

  

int main(int argc, char *argv[])  

{  

    Application a(argc, argv);  

    FullScreenWindow w;  

    a.setWindowInstance(&w);  

    w.show();  

  

    return a.exec();  

}  

application.h

[cpp] view
plain copy

#ifndef APPLICATION_H  

#define APPLICATION_H  

  

#include <QApplication>  

#include <QDebug>  

#include "fullscreenwindow.h"  

#include "qtimer.h"  

  

class Application : public QApplication  

{  

  

public:  

    Application(int & argc, char ** argv);  

    bool notify(QObject *, QEvent *);  

    void setWindowInstance(FullScreenWindow* wnd);  

  

private:  

    FullScreenWindow* window; //保存一个你窗体的指针  

    QTimer *timer;  

  

};  

  

#endif // APPLICATION_H  

application.cpp

[cpp] view
plain copy

#include "application.h"  

  

Application::Application(int &argc, char **argv)  

    :  QApplication(argc,argv)  

    ,  window(0)  

{  

    //新建一个QTimer对象  

    timer = new QTimer();  

    //设置定时器每个多少毫秒发送一个timeout()信号  

    timer->setInterval(10000);  

    //启动定时器  

    timer->start();  

}  

  

void Application::setWindowInstance(FullScreenWindow *wnd)  

{  

    window = wnd;  

    //信号和槽  

    connect(timer, SIGNAL(timeout()), wnd,SLOT(onTimerOut()));  

}  

  

bool Application::notify(QObject *obj, QEvent *e)  

{  

    if(e->type() == QEvent::MouseMove)  

    {  

        if(window)  

        {  

            timer->stop();  

            qDebug()<<"stop";  

            window->resize(500,500); //调用你窗体相应的函数  

        }  

    }  

    else  

    {  

        if(!timer->isActive())  

        {  

            timer->start();  

            qDebug()<<"start";  

        }  

    }  

  

    return QApplication::notify(obj,e);  

}  

fullscreenwindow.h

[cpp] view
plain copy

#ifndef FULLSCREENWINDOW_H  

#define FULLSCREENWINDOW_H  

  

#include <QMainWindow>  

  

namespace Ui {  

    class FullScreenWindow;  

}  

  

class FullScreenWindow : public QMainWindow  

{  

    Q_OBJECT  

  

public:  

    explicit FullScreenWindow(QWidget *parent = 0);  

    ~FullScreenWindow();  

  

private:  

    Ui::FullScreenWindow *ui;  

  

private slots:  

    void onTimerOut();  

};  

  

#endif // FULLSCREENWINDOW_H  

fullscreenwindow.cpp

[cpp] view
plain copy

#include "fullscreenwindow.h"  

#include "ui_fullscreenwindow.h"  

  

FullScreenWindow::FullScreenWindow(QWidget *parent) :  

    QMainWindow(parent),  

    ui(new Ui::FullScreenWindow)  

{  

    ui->setupUi(this);  

}  

  

FullScreenWindow::~FullScreenWindow()  

{  

    delete ui;  

}  

  

void FullScreenWindow::onTimerOut()  

{  

    this->resize(900,900);  

}  

实现的效果是:界面开始的时候窗体大小400*300,鼠标移动的话就变成了500*500,如果鼠标10s不动,窗体大小变成900*900,当然,你也可以在onTimeOut函数中实现窗体的切换操作,那就是屏保效果啦。

下载程序

想法二:

使用定时器(1s)和计数器,窗体声明的时候获取当前鼠标位置(x,y),当定时器时间到的时候再次获取鼠标位置(x1,y1),如果鼠标位置改变,那就说明这1s内鼠标移动了,计数器清零,如果鼠标位置不变,那计数器就+1,直到计数器到达一定数量,表示鼠标这段时间没有移动,那就进入切换界面操作,当然,这种做法不是十分科学,有可能在1s之内鼠标动了又移回到之前的位置(一个像素也不差),这种情况没法判断的,但是这种情况手工发生几率不大。

总结:

想法一实现的过程中遇到以下问题:当鼠标不在当前界面上时,或者界面最小化时,程序会当成鼠标未移动,也就是说此时你移动鼠标,到达时间时,也会进入屏保程序,所以Application里面获取的QEvent中的MouseMove指的是在程序界面上的鼠标移动。目前这个问题还是没有解决,期待大神解答。

点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐