qt事件过滤器的使用(可以用于控制屏幕背光等)
在嵌入式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事件过滤器的使用(可以用于控制屏幕背光等)的更多相关文章
- Qt小项目之串口助手控制LED
Qt小项目之串口助手控制LED 前言 最近刚学了一点Qt开发上位机,尝试着做个小软件练练手.查找了很多资料,做了一个简单的串口助手,可以实现串口基本发送和接收功能,支持中文显示,还可以控制STM32开 ...
- Android -- 距离感应器控制屏幕灭屏白屏
权限 <u ...
- Cocos2D-x权威指南:通过节点控制屏幕中的全体渲染对象
本节,已经能够利用我们眼下所学的知识做出一些有趣的东西.之前已经说过,CCNode类没有贴图,也就是说在屏幕上单独建立一个节点是没有不论什么效果的,可是能够通过这个"无形"的节点来 ...
- Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:
Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...
- qt,pro文件中用于平台区分的写法
qt,pro文件中用于平台区分的写法 切记: 大括号和平台需要在同一行中,否则会失效 unix { TARGET = appname } macx { TARGET = appname2 } win3 ...
- amba H2平台用PWM控制LCD背光
ambarella H2系列Soc的GPIO口能作PWM使用的个数有限(GPIO0-GPIO3),从PRM里GPIO: Function Selection章节可以得到如何配置GPIO为PWM功能. ...
- QT事件过滤器(QT事件处理的5个层次:自己覆盖或过滤,父窗口过滤,Application过滤与通知)
Qt事件模型一个真正强大的特色是一个QObject 的实例能够管理另一个QObject 实例的事件. 让我们试着设想已经有了一个CustomerInfoDialog的小部件.CustomerInfoD ...
- Qt 事件过滤器
Qt创建了QEvent事件对象之后,会调用QObject的event()函数做事件的分发.有时候,你可能需要在调用event()函数之前做一些另外的操作,比如,对话框上某些组件可能并不需要响应回车按下 ...
- Qt编写Onvif搜索及云台控制工具
一.前言 这个工具很早以前大概在2013年就想做了,后面杂七杂八的事情一再耽搁,记得当时最初用的是soap类来搜索和解析的,后面发现太大了,每次编译都要等好久,光源码文件加起来都快10MB了,而且函数 ...
随机推荐
- 北航2018级算法期末上机实录随笔1st
简单记录下题目类型和做题情况,理性复习同时也希望提供一些参考 题目描述 共计八个题目,按照助教的划分,题目分类如下 一个签到(二分查找),两个板子(活动选择.KMP(洛谷kmp模板题)),一个板子变形 ...
- # scrapy(二):get请求
scrapy中的get请求及基本使用: 1. 创建scrapy项目 scrapy startproject QiuBaiProject 2. 创建爬虫文件 scrapy genspider QiuBa ...
- 数据可视化基础专题(八):Pandas基础(七) 数据清洗与预处理相关
1.数据概览 第一步当然是把缺失的数据找出来, Pandas 找缺失数据可以使用 info() 这个方法(这里选用的数据源还是前面一篇文章所使用的 Excel ,小编这里简单的随机删除掉几个数据) i ...
- Python之爬虫(十六) Scrapy框架中选择器的用法
Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpath或者CSS表达式来选择HTML文件的某个部分Xpath是专门在XML文件中选择节点的语言,也可以用在HTM ...
- df['']和df[['']]的区别
- 谈谈JVM(基础模型)
一,基本概念 JVM是可运行Java代码的假想计算机 ,包括一套字节码指令集.一组寄存器.一个栈. 一个垃圾回收,堆 和 一个存储方法域. JVM 是运行在操作系统之上的,它与硬件没 ...
- 【API进阶之路】老板给我涨薪30%!如何通过SDK接口搞定千万级流量直播
摘要:看我如何通过API Explorer 的SDK接口搞定千万级流量直播. 最近几个月,我的变化其实还蛮大的,从一个被实习生“无视”的“前浪”,转变成了不仅能够解决技术问题还能解决业务问题(顺手还能 ...
- ASP.NET CORE之中间件-自定义异常中间件
参考资料:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1 1.一般A ...
- 【C#】根据开始时间和结束时间筛选存在的信息
背景 业务需求中,需要根绝开始时间和结束时间筛选一段时间内的任务存在个数. 示例图片 根据开始时间 9:00到 结束时间11:00 筛选信息 总共有这么四种情况可能出现 插入测试数据 CREATE T ...
- SpringBoot整合Swagger3生成接口文档
前后端分离的项目,接口文档的存在十分重要.与手动编写接口文档不同,swagger是一个自动生成接口文档的工具,在需求不断变更的环境下,手动编写文档的效率实在太低.与swagger2相比新版的swagg ...