在嵌入式qt项目中,有时并不需求屏幕一直亮着,需要一段时间不操作时,将屏幕背光关掉,以达到节能的目的;

在qt项目中,可以通过重写事件过滤器来实现屏幕操作的检测,加上定时器的时间控制,可以实现指定时间内没有屏幕操作,给应用程序发送一个信号;

下面是我写的一个测试代码:

首先是事件过滤器的重写代码:

这里我把这个类做成单实例的了,这样可以在应用程序中全局使用,(所有界面的类中都可以连接其超时信号)

ceventfilter.cpp

#include "ceventfilter.h"
#include <QDebug>
#include <QEvent> CEventFilter::CEventFilter(QObject *parent) :
QObject(parent)
{
m_timeOutMSec = 30000;
m_eventTimer = new QTimer;
m_eventTimer->setInterval(m_timeOutMSec);
connect(m_eventTimer, SIGNAL(timeout()), this, SLOT(onTimerTimeOut())); m_eventTimer->start(m_timeOutMSec); } CEventFilter::~CEventFilter()
{
delete m_eventTimer;
} bool CEventFilter::eventFilter(QObject *ob, QEvent *e)
{
if( e->type()==QEvent::MouseMove||e->type()==QEvent::MouseButtonPress
||e->type()==QEvent::MouseButtonRelease)// 判断如果是鼠标移动事件
{
if(m_eventTimer->isActive())//have_dosthtimer很显然是个定时器,在这判断是否已经开启.
{
m_eventTimer->stop();
m_eventTimer->start();//如果已经开启,并且有鼠标移动事件就需要计时器重新计算(这里是30s)
//qDebug()<<"detect touch event, restart timer, Event type: "<<e->type();
}
} return QObject::eventFilter(ob,e);//这里是把事件发送出去,
} //超时发送信号
void CEventFilter::onTimerTimeOut()
{
qDebug()<<m_timeOutMSec<<" ms not operation ...";
emit noOperationDetect();
}
//设置超时时间
void CEventFilter::setTimeOutSecond(int sec)
{
m_timeOutMSec = sec*1000;
m_eventTimer->stop();
m_eventTimer->setInterval(m_timeOutMSec);
m_eventTimer->start(); } CEventFilter *CEventFilter::m_instance = NULL;
CEventFilter *CEventFilter::getInstance()
{
if ( m_instance == NULL )
{
m_instance = new CEventFilter;
} return m_instance;
}

头文件:

ceventfilter.h

#ifndef CEVENTFILTER_H
#define CEVENTFILTER_H #include <QObject>
#include <QTimer> #define TIME_OUT_TIME 30000 class CEventFilter : public QObject
{
Q_OBJECT
protected:
explicit CEventFilter(QObject *parent = 0);
~CEventFilter();
static CEventFilter *m_instance;
virtual bool eventFilter(QObject *ob, QEvent *e); //重写事件过滤器 public:
static CEventFilter *getInstance();
void setTimeOutSecond(int sec); //设置超时时间 signals:
void noOperationDetect(); //时间超时时发送信号 public slots:
void onTimerTimeOut(); private:
int m_timeOutMSec;
QTimer *m_eventTimer;
}; #endif // CEVENTFILTER_H

调用代码:

//获取实例,连接槽函数
m_pEventFilter = CEventFilter::getInstance();
connect(m_pEventFilter, SIGNAL(noOperationDetect()), this, SLOT(onNoOperationDetect()));

这里做了一个按钮,是交替断开与连接事件过滤器超时信号的,为了测试信号的:

void MainWindow::on_pushButton_clicked()
{
m_pEventFilter->setTimeOutSecond(3); if(m_connectFlag)
{
m_connectFlag = false;
qDebug()<<"diconnect signal slots";
ui->msg->setText("diconnect signal slots");
m_pEventFilter->disconnect();
}
else
{
m_connectFlag = true;
qDebug()<<"connect signal slots";
ui->msg->setText("connect signal slots");
connect(m_pEventFilter, SIGNAL(noOperationDetect()), this, SLOT(onNoOperationDetect()));
}
}

槽函数:

在界面上拉了一个label控件,用于显示提示信息:

void MainWindow::onNoOperationDetect()
{
ui->msg->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")+": non operate detect");
qDebug()<<"non operate detect";
}

这样在超时时,会在label上显示出来时间和信息:

这里我设置的是3s超时,如果鼠标不操作界面,3s会在label上更新显示信息,如果一直点界面,就不会超时;

这个如果放在嵌入式设备上运行,用手触摸屏幕也是一样的效果,和用鼠标操作是一样的;

测试代码工程已上传csdn:

https://download.csdn.net/download/wuquan_1230/10837056

个人微信服务号同步推送文章(微信公众号:fensTeck):

qt事件过滤器的使用(可以用于控制屏幕背光等)的更多相关文章

  1. Qt小项目之串口助手控制LED

    Qt小项目之串口助手控制LED 前言 最近刚学了一点Qt开发上位机,尝试着做个小软件练练手.查找了很多资料,做了一个简单的串口助手,可以实现串口基本发送和接收功能,支持中文显示,还可以控制STM32开 ...

  2. Android -- 距离感应器控制屏幕灭屏白屏

    权限                                                                                             <u ...

  3. Cocos2D-x权威指南:通过节点控制屏幕中的全体渲染对象

    本节,已经能够利用我们眼下所学的知识做出一些有趣的东西.之前已经说过,CCNode类没有贴图,也就是说在屏幕上单独建立一个节点是没有不论什么效果的,可是能够通过这个"无形"的节点来 ...

  4. Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:

    Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...

  5. qt,pro文件中用于平台区分的写法

    qt,pro文件中用于平台区分的写法 切记: 大括号和平台需要在同一行中,否则会失效 unix { TARGET = appname } macx { TARGET = appname2 } win3 ...

  6. amba H2平台用PWM控制LCD背光

    ambarella H2系列Soc的GPIO口能作PWM使用的个数有限(GPIO0-GPIO3),从PRM里GPIO: Function Selection章节可以得到如何配置GPIO为PWM功能. ...

  7. QT事件过滤器(QT事件处理的5个层次:自己覆盖或过滤,父窗口过滤,Application过滤与通知)

    Qt事件模型一个真正强大的特色是一个QObject 的实例能够管理另一个QObject 实例的事件. 让我们试着设想已经有了一个CustomerInfoDialog的小部件.CustomerInfoD ...

  8. Qt 事件过滤器

    Qt创建了QEvent事件对象之后,会调用QObject的event()函数做事件的分发.有时候,你可能需要在调用event()函数之前做一些另外的操作,比如,对话框上某些组件可能并不需要响应回车按下 ...

  9. Qt编写Onvif搜索及云台控制工具

    一.前言 这个工具很早以前大概在2013年就想做了,后面杂七杂八的事情一再耽搁,记得当时最初用的是soap类来搜索和解析的,后面发现太大了,每次编译都要等好久,光源码文件加起来都快10MB了,而且函数 ...

随机推荐

  1. 装机预备技能,Linux系统简介,安装Linux系统,Linux基本操作-云计算学习(2)

    装机预备技能 问题 要求安装一台可用的KVM服务器: RHEL与CentOS系统有什么关联? Linux系统中第三块SCSI硬盘如何表示? 步骤 实现此案例需要按照如下步骤进行. 步骤一:RHEL系统 ...

  2. 【TokyoWesterns CTF】shrine

    信息: 题目来源:TokyoWesterns CTF 标签:flask.SSTI 解题过程 构建题目环境后,访问主页可以获得程序源码: import flask import os app = fla ...

  3. python 并发专题(六):协程相关函数以及实现(gevent)

    文档资源 http://sdiehl.github.io/gevent-tutorial/ 一.协程实现 线程和协程 既然我们上面也说了,协程也被称为微线程,下面对比一下协程和线程: 线程之间需要上下 ...

  4. 机器学习实战基础(二十七):sklearn中的降维算法PCA和SVD(八)PCA对手写数字数据集的降维

    PCA对手写数字数据集的降维 1. 导入需要的模块和库 from sklearn.decomposition import PCA from sklearn.ensemble import Rando ...

  5. redis入门指南(五)—— 复制与哨兵

    写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 一.复制 1.在复制中,数据库分为两类,一类主数据库,一类从数据库,主库用来读写,从库用来读,主 ...

  6. Lodash中数组常用方法

    数组方法 1.数组对象去重 differenceBy(array, [values], [iteratee=_.identity]) let newArr =_.differenceBy( [{ na ...

  7. 基于SSM框架的简单问答社区

    前言:学习了Spring.SpringMVC.MyBatis框架后,开发了一套简单的问答社区,前端采用Bootstrap开发框架. 版本信息 IDEA:2020.1.2 JDK:14.0.1 Mave ...

  8. 第一部分软件测试综述——软件测试背景【软件测试】(美)Ron Patton中文电子版

    截取自:第一部分软件测试综述——软件测试背景[软件测试](美)Ron Patton中文电子版(有需要的可以关注我) 第一部分软件测试综述 对手的程序死掉叫崩溃.自己的程序死掉叫“身体不良反应(idio ...

  9. nvm配置及常用指令、配置全局node_global

    1.nvm-windows下载 nvm下载链接点击最新版本nvm-setup.zip下载安装即可. 2.配置nvm环境变量(安装nvm会默认配置,可忽略) 环境变量打开方式:右键此电脑 > 属性 ...

  10. css初始化表(normalize.css)

    为什么要初始化CSS? 建站老手都知道,这是为了考虑到浏览器的兼容问题,其实不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面差异.当然,初始化样式会对SEO有一定的 ...