Qt之超时锁屏

一、实现思路

首先开启一个线程用于QTimer定时器计时,一打开应用就开启定时器计时,超时则显示锁屏窗口;因为是多窗口的应用,所以需要监控全局鼠标事件,所以需要子类继承QApplication类

二、效果

三、核心代码

监控全局鼠标事件的类为MainApplication,其中也实现了开启一个线程进行定时器计时,以及超时显示锁屏窗口的功能。其中myLockWindow 为自定义的锁屏窗口。

mainapplication.h文件 


class MainApplication : public QApplication
{
    Q_OBJECT

public:
     MainApplication(int&argc,char **argv);
     ~MainApplication();

     bool notify(QObject*, QEvent *);

     myLockWindow *m_myLockWindow; //锁屏窗口

private slots:
    void onTimeOut(); //超时锁屏槽函数

private:

    QObject *m_currWinObj; //鼠标事件发生时的当前所在窗口

    QTimer *m_pTimer; //定时器
    QThread *m_pThread; //定时器线程
};

mainapplication.app文件 


#include "mainapplication.h"

MainApplication::MainApplication(int &argc,char **argv):
QApplication(argc,argv)
{

    m_currWinObj = new QObject(); //初始化鼠标事件发生时的当前所在窗口

    //初始化定时器线程和定时器
    m_pThread = new QThread(this);
    m_pTimer = new QTimer();
    m_pTimer->moveToThread(m_pThread);
    m_pTimer->setInterval(5000);
    connect(m_pThread, SIGNAL(started()), m_pTimer, SLOT(start()));
    connect(m_pTimer, SIGNAL(timeout()),this,SLOT(onTimeOut()));
    //开启线程,调用定时器的start()
    m_pThread->start();
    m_myLockWindow = new myLockWindow(); //初始化锁屏窗口
    m_myLockWindow->m_unlockFlag = true; //初始化解除锁屏成功标志

}

MainApplication::~MainApplication()
{
    //彻底结束线程(单独的一个quit无法彻底结束进程)
    m_pThread->requestInterruption();
    m_pThread->quit();
    m_pThread->wait();
}

bool MainApplication::notify(QObject *obj, QEvent *e)
{
    //因为鼠标点击或滑动到任何窗口部件都会进入该函数,所以根据objectName()过滤窗口部件
    if(obj->objectName().right(1) == "W")
    {
        //触摸屏幕和滑动屏幕都会点击屏幕,所以这里只检测鼠标点击事件
        if(e->type() == QEvent::MouseButtonPress)
        {

            m_pThread->quit(); //线程结束后,则在此线程的定时器会自动停止计时
        }
        else if(e->type() == QEvent::MouseButtonRelease)
        {

            m_pThread->start(); //线程开始,会发送started()信号,启动定时器的start()槽函数
        }

        m_currWinObj = obj; //获得鼠标事件发生时的当前所在窗口
    }

    return QApplication::notify(obj,e);
}

//超时锁屏槽函数
void MainApplication::onTimeOut()
{
    //m_unlockFlag为false,表示锁屏窗口未关闭,则即使再超时也不会再显示锁屏窗口
    if(m_myLockWindow->m_unlockFlag == true) //关闭锁屏窗口,则会将m_unlockFlag设置为true
    {
        qDebug()<<"已锁屏";
        //创建锁屏窗口对象,并显示该窗口
        m_myLockWindow = new myLockWindow();
        m_myLockWindow->show();
        qDebug()<<"创建锁屏窗口并显示";

        //在构建对象时,会自动设置m_unlockFlag,所以在构建后要复位m_unlockFlag
        m_myLockWindow->m_unlockFlag = false;
    }
    else
    {
        qDebug()<<"重复锁屏";
    }
}

 myLockWindow.cpp

myLockWindow::myLockWindow(QWidget *parent) : QWidget(parent)
{
    this->setFixedSize(365,240);
//    this->m_unlockFlag=false;
    lockBtn = new QPushButton(this);
    lockBtn->setText("解除屏保");
    connect(lockBtn,SIGNAL(clicked()),this,SLOT(unLock()));

}
void myLockWindow::unLock()
{
    qDebug()<<"解除屏保";
    this->m_unlockFlag=true;
    this->close();
    //一般情况,顶层窗口调用close:应用程序销毁该窗口部件及子部件。
     //非顶层窗口close:关闭时只是隐藏,不会被销毁。

}

 注://这里不能为false,否则每次锁屏都会开启一个新窗口

 

main.cpp

    MainApplication a(argc, argv);  
    a.processEvents(); // 刷新事件循环
    Widget w;
    w.show();
    return a.exec();

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ze言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值