文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Qt超时锁屏的实现示例

2024-04-02 19:55

关注

概述

Qt实现超时锁屏的功能(工控机触摸屏),当手长时间不触摸屏幕的时候,程序超时会显示锁屏窗口。

效果

主窗口超时显示锁屏窗口:

在这里插入图片描述

系统窗口超时显示锁屏窗口:

在这里插入图片描述

在这里插入图片描述

实现思路

核心代码

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

globalapplication.h 文件的内容如下:

class GlobalApplication : public QApplication
{
    Q_OBJECT

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

     bool notify(QObject*, QEvent *);

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

private:
    myLockWindow *m_myLockWindow; //锁屏窗口
    QObject *m_currWinObj; //鼠标事件发生时的当前所在窗口

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

注:Widget_Lock 为锁屏窗口类,可以替换成你自己要显示的窗口。

globalapplication.cpp 文件的内容如下:

#include "globalapplication.h"

GlobalApplication::GlobalApplication(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(4000);
    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; //初始化解除锁屏成功标志
}

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

bool GlobalApplication::notify(QObject *obj, QEvent *e)
{
    //因为鼠标点击或滑动到任何窗口部件都会进入该函数,所以根据objectName()过滤窗口部件
    if(obj->objectName().right(1) == "W") //cleanW mainW
    {
        //工控机是触摸屏,触摸屏幕和滑动屏幕都会点击屏幕,所以这里只检测鼠标点击事件
        if(e->type() == QEvent::MouseButtonPress) //不区分左右键按下了
        {
            //qDebug() << "objName:" << obj->objectName();
            //qDebug()<<"press stop";
            m_pThread->quit(); //线程结束后,则在此线程的定时器会自动停止计时
        }
        else if(e->type() == QEvent::MouseButtonRelease)
        {
            //qDebug()<<"release start";
            m_pThread->start(); //线程开始,会发送started()信号,启动定时器的start()槽函数
        }

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

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

//超时锁屏槽函数
void GlobalApplication::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()<<"重复锁屏";
    }
}

测试函数

int main(int argc, char *argv[])
{
    GlobalApplication a(argc, argv);

    QDesktopWidget *desktopWidget = QApplication::desktop();
    QRect screenRect = desktopWidget->screenGeometry();
    qDebug()<<screenRect.width();
    qDebug()<<screenRect.height();

    //获取计算机名称
    QString localHostName = QHostInfo::localHostName();
    qDebug() << "计算机名:" << localHostName;

    QPixmap pixmap(":/HeadImage.png"); // 装载图片
    QSplashScreen splash(pixmap); // 初始化图片到QSplashScreen
    splash.show(); // 显示图片
    a.processEvents(); // 刷新事件循环

    Widget w;
    splash.finish(&w); // 完成后自动close

     w.show();

    return a.exec();
}

到此这篇关于Qt超时锁屏的实现示例的文章就介绍到这了,更多相关Qt超时锁屏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯