Qt触摸屏 超时关屏,触摸亮屏

不带桌面管理的linux平台 

通过重写QApplication的notify监听触摸事件,来控制定时器重新计时

Application.h

#ifndef APPLICATION_H
#define APPLICATION_H


#include <QApplication>
#include <QTimer>
#include <QWidget>
#include <QMutex>

class Application:public QApplication
{
    Q_OBJECT
  public:
    explicit Application(int& argc, char** argv);
    bool notify(QObject *, QEvent *);

    void Backlight(bool status);
    void setInterval(int sec);



  public slots:
    //操作超时
    void OperationTimeOut();

    //进入屏保
    void EnterScreenSaver();
    //退出屏保
    void ExitScreenSaver();


  private:

    QTimer* _timer;
    bool _isScreenSaver;
    QWidget* _screen;
    QMutex _mutex;

};


#endif // APPLICATION_H

Application.cpp

#include "Application.h"
#include <QDebug>

#if defined(Q_OS_LINUX)
#include <unistd.h>
#include <time.h>
#endif

Application::Application(int &argc, char **argv)
    :QApplication(argc,argv, QApplication::GuiServer),_screen(NULL),
      _isScreenSaver(false)
{
    //打开背光
    Backlight(true);

    //设置定时器
    _timer = new QTimer();
    _timer->setInterval(3*1000);
    _timer->start();
    QObject::connect(_timer, SIGNAL(timeout()), this, SLOT(OperationTimeOut()));
}

void Application::Backlight(bool status)
{
    if(status)
        system("echo \"7\" > /sys/devices/platform/backlight/backlight/backlight/brightness ");
    else
      system("echo \"0\" > /sys/devices/platform/backlight/backlight/backlight/brightness ");
}

void Application::setInterval(int sec)
{
  _timer->stop();
  _timer->setInterval(sec*1000);
  _timer->start();
}



void Application::OperationTimeOut()
{
    EnterScreenSaver();
}

//进入屏保
void Application::EnterScreenSaver()
{
    if(_mutex.tryLock())
    {
        if(!_isScreenSaver)
        {
            Backlight(false);

            if(_screen == NULL)
            {//实例化一个QWidget,可做屏保 和 接收唤醒时触摸事件
                _screen = new QWidget;
                _screen->showFullScreen();
            }
            _isScreenSaver = true;
            qDebug()<<__FUNCTION__;
        }
        _mutex.unlock();
    }
}

//退出屏保
void Application::ExitScreenSaver()
{
    _mutex.lock();
    if(_isScreenSaver)
    {

        if(_screen != NULL)
        {
#if defined(Q_OS_LINUX)
            usleep(1000*300);
#endif
            _screen->close();
            _screen = NULL;
        }
        _isScreenSaver = false;
        Backlight(true);
        qDebug()<<__FUNCTION__;
    }
    _mutex.unlock();
}


bool Application::notify(QObject *obj, QEvent *e)
{
    if(e->type() == QEvent::MouseMove)
    {
        _timer->stop();
        ExitScreenSaver();
    } else {
        if(!_timer->isActive())
            _timer->start();
    }
    return QApplication::notify(obj,e);
}



在 Android 中,当屏幕关闭后,设备会进入睡眠模式以节省电量。在睡眠模式下,应用程序的活动将被暂停或停止。要使您的应用程序在屏幕关闭后继续运行并接收信息,您可以使用以下两种方法之一: 1. 使用 WakeLock WakeLock 是一种锁定机制,它允许您在设备进入睡眠模式时保持应用程序处于活动状态。这意味着您的应用程序将继续在后台运行,并且您可以接收信息、数据和通知。 使用 WakeLock 需要注意两点: - 使用 WakeLock 可能会影响设备的电池寿命。 - 不要忘记在应用程序不需要使用 WakeLock 时释放它。 以下是使用 WakeLock 的代码示例: ``` PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock"); wakeLock.acquire(); ``` 2. 使用 Foreground Service 前台服务是一种长时间运行的服务,它通常与用户正在进行的活动相关联。在运行前台服务时,应用程序将继续在后台运行,并且您可以接收信息、数据和通知。 使用前台服务需要注意: - 前台服务将显示一个通知,告诉用户应用程序正在运行。 - 前台服务将在设备的电池寿命方面产生一些影响。 以下是使用前台服务的代码示例: ``` public class MyService extends Service { private static final int NOTIFICATION_ID = 1; @Override public int onStartCommand(Intent intent, int flags, int startId) { Notification notification = new Notification.Builder(this) .setContentTitle("My App") .setContentText("Running in background") .setSmallIcon(R.drawable.icon) .build(); startForeground(NOTIFICATION_ID, notification); // Your code here return START_STICKY; } @Override public IBinder onBind(Intent intent) { return null; } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值