qt事件过滤器的使用(可以用于控制屏幕背光等)

简介: 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


调用代码:

先在main函数里安装过滤器:

    QApplication a(argc, argv);
    a.setFont(QFont("Microsoft Yahei", 10));
    a.setWindowIcon(QIcon(":/main.ico"));
    a.installEventFilter(CEventFilter::getInstance());
    initMasterStyleSheet();


在QWidget的构造函数中获取实例并连接信号槽:

//获取实例,连接槽函数
    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:

qt事件过滤器实现屏幕无操作超时通知_qt屏幕锁定-C++文档类资源-CSDN下载

目录
相关文章
|
8月前
|
存储 开发框架 开发者
QT C++焦点事件:多角度解析实用技巧与方法
QT C++焦点事件:多角度解析实用技巧与方法
1508 0
|
13天前
|
开发者
Qt异步实现事件的定时执行 - QTimer和QThread的联合使用
通过将QTimer和QThread结合使用,Qt开发者可以实现高效的异步定时任务执行。这种方法不仅可以提升应用程序的响应能力,还可以在复杂的多线程环境中保持代码的简洁和可维护性。希望本文的详细介绍和示例代码能够帮助您更好地理解和应用这一技术。
31 14
|
3月前
|
存储 Windows
(13) Qt事件系统(two)
文章详细介绍了Qt事件系统,包括事件分发、自定义事件、事件传播机制、事件过滤以及事件与信号的区别。
133 3
(13) Qt事件系统(two)
|
3月前
|
编解码 程序员
(12)Qt事件系统(one)
本文详细介绍了Qt事件系统,包括各种系统事件、鼠标事件、键盘事件、定时器等的处理方法和示例代码。
114 0
|
5月前
|
开发者
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
260 4
|
7月前
Qt事件分发器、事件过滤器
Qt事件分发器、事件过滤器
|
6月前
|
开发者
Qt中的事件该如何学习?(附带案例)
事件是Qt中比较重要的一部分,在初期如果理解不当学习可能会比较困难,这里提一嘴当初教我的那位老师水平是真的高,让我很轻易的就理解了事件的概念。 在平时我们见到那些界面上的某些快捷键就有可能是事件做的,例如ESC关闭窗口,Enter提交或者登录这种类似的,这也是事件的强大之处。
147 0
|
8月前
|
开发框架 算法 程序员
【Qt 元对象系统】深入探索Qt事件过滤:从基础到高级应用
【Qt 元对象系统】深入探索Qt事件过滤:从基础到高级应用
232 7
|
8月前
|
测试技术 数据库 C++
Qt C++拖放事件探索之旅:多方法深入解析
Qt C++拖放事件探索之旅:多方法深入解析
626 1
|
6月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
216 1