服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - Qt超时锁屏的实现示例

Qt超时锁屏的实现示例

2022-08-24 14:07C君莫笑 C/C++

本文主要介绍了Qt超时锁屏的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

概述

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

 

效果

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

Qt超时锁屏的实现示例

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

Qt超时锁屏的实现示例

Qt超时锁屏的实现示例

 

实现思路

  • 首先开启一个线程用于QTimer定时器计时,最开始进入软件开启定时器计时,超时则显示锁屏窗口;而手触摸屏幕会触发鼠标点击事件,则停止计时;而手离开屏幕会触发鼠标释放事件,则重新开始计时。
  • 因为是多窗口的应用软件,所以需要监控全局鼠标事件,所以需要子类化QApplication类。

 

核心代码

监控全局鼠标事件的类为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超时锁屏内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_34623621/article/details/122326466

延伸 · 阅读

精彩推荐
  • C/C++C++实现将输入复制到输出的方法

    C++实现将输入复制到输出的方法

    这篇文章主要介绍了C++实现将输入复制到输出的方法,实例分析了C++字符串转换及输入输出操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    defias9192021-03-04
  • C/C++C语言 结构体和指针详解及简单示例

    C语言 结构体和指针详解及简单示例

    本文主要介绍C语言 结构体和指针,这里整理了相关资料,并附示例代码和实现结果,以便大家学习参考,希望能帮助学习C语言的朋友...

    C语言中文网7462021-04-14
  • C/C++C语言当函数执行成功时return1还是0

    C语言当函数执行成功时return1还是0

    本文主要介绍了C语言当函数执行成功时return1还是0,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    C语言与C++编程7582021-12-31
  • C/C++C++ 中二分查找递归非递归实现并分析

    C++ 中二分查找递归非递归实现并分析

    这篇文章主要介绍了C++ 中二分查找递归非递归实现并分析的相关资料,需要的朋友可以参考下...

    he_shuai209362021-05-14
  • C/C++char str[] 与 char *str的区别详细解析

    char str[] 与 char *str的区别详细解析

    以下是对char str[]与char *str的区别进行了详细的介绍,需要的朋友可以过来参考下...

    C语言教程网6592020-12-28
  • C/C++C语言关于时间复杂度详解

    C语言关于时间复杂度详解

    大家好,本篇文章主要讲的是C语言关于时间复杂度详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览...

    爽爽不会编程7252022-08-13
  • C/C++深入理解C++中的new/delete和malloc/free动态内存管理及区别介绍

    深入理解C++中的new/delete和malloc/free动态内存管理及区别介绍

    这篇文章主要介绍了深入理解C++中的new/delete和malloc/free动态内存管理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...

    tongqingliu5782021-09-27
  • C/C++C++随机生成迷宫算法

    C++随机生成迷宫算法

    这篇文章主要为大家详细介绍了C++随机生成迷宫算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    weixin_3389560412092021-08-26