QT调节屏幕亮度

1、目标

利用QT实现调节屏幕亮度功能:在无屏幕无触控时,将屏幕亮度调低,若有触控则调到最亮。

2、调节亮度命令

目标装置使用嵌入式Linux系统,调节屏幕亮度的指令为:

echo x > /sys/class/backlight/backlight/brightness #x范围为0~10

利用终端执行此命令是没有问题的。不过,采用QProcess执行这个命令时,怎么都不响应,也不提示任何错误信息。

最终发现要采用这样的命令:

/bin/sh -c "echo x > /sys/class/backlight/backlight/brightness" #x为亮度值

程序代码实现如下:

QProcess setBright(this);// 进程函数,调用外部指令窗口
setBright.start("cat /sys/class/backlight/backlight/brightness \n"); #获取当前亮度值
setBright.waitForFinished(); // 等待命令执行完成
QString strCmd = QString("/bin/sh -c \"echo %1 > /sys/class/backlight/backlight/brightness\"").arg(brightness/10);
//执行指令
setBright.start(strCmd.toLocal8Bit().data());   //convert QString to char
setBright.waitForFinished(1000);// 等待指令执行完毕
QString strErrors = setBright.readAllStandardError();// 获取返回值
qDebug()<<strErrors;

3、检测触控/鼠标事件唤醒屏幕

3.1、功能说明

若一段时间没有点击屏幕,则调暗或熄灭屏幕。如果有触控(即鼠标按下/移动)事件,则唤醒点亮屏幕。

3.2、有窗口时的实现方法

有窗口时,实现比较简单。在窗口控件类中实现鼠标事件响应即可。示例代码如下:

//h
protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
//cpp
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    qDebug() << "Mouse pressed";
    mScreenSleep->ToWake();    //唤醒屏幕
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    qDebug() << "Mouse moved";
    mScreenSleep->ToWake();    //唤醒屏幕
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    qDebug() << "Mouse released";
    mScreenSleep->ToWake();    //唤醒屏幕
}

注意:只能在窗口控件内响应鼠标事件。可使用QApplication类来响应窗口控件外的事件。

问题:窗口全屏且设置为透明时,若屏幕熄灭后无法点亮。

3.3、无窗口时的实现方法

3.3.1、利用QApplication类函数实现

示例代码如下:

//h
#ifndef GLOBALAPP_H
#define GLOBALAPP_H

#include <QApplication>
#include "screensleep.h"    //屏幕亮度控制类

class globalapp : public QApplication
{
public:
    globalapp(int &argc,char **argv);
    ~globalapp();
    ScreenSleep *mScreenSleep;

    bool notify(QObject*, QEvent *);
};

#endif // GLOBALAPP_H

//cpp
#include "globalapp.h"
#include <QDebug>

globalapp::globalapp(int &argc,char **argv):QApplication(argc,argv)
{
    mScreenSleep    = new ScreenSleep(this);
}
globalapp::~globalapp()
{
    delete  mScreenSleep;
}
bool globalapp::notify(QObject *obj, QEvent *e)
{
    if(e->type() == QEvent::KeyPress || e->type() == QEvent::MouseButtonPress ||  e->type() == QEvent::MouseMove)
    {
        mScreenSleep->ToWake();
    }
    else if(e->type() == QEvent::SockAct) //为什么响应的是这个事件???
    {
        mScreenSleep->ToWake();
    }
    return QApplication::notify(obj,e);
}
//main
int main(int argc, char *argv[])
{
    globalapp a(argc, argv);    //使用自建的QApplication对象
    return a.exec();
}

3.3.2、利用事件过滤器函数

示例代码如下:

#include <QApplication>
#include <QMouseEvent>
#include <QDebug>

class MouseHook : public QObject {
    bool eventFilter(QObject *obj, QEvent *event) override {
        if (event->type() == QEvent::MouseMove) {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
            //放置事件处理
        }
        else if(event->type() == QEvent::SockAct)
        {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
            //放置事件处理
        }
        return QObject::eventFilter(obj, event);
    }
};
int main(int argc, char *argv[])
{
    MouseHook mouseHook;
    a.installEventFilter(&mouseHook);
    return a.exec();
}

从上面的注释中也看到了,无窗口时,鼠标点击或触控事件并不等于QT定义的鼠标事件,而是一个QEvent::SockAct事件!

至于为什么是这个,还未找到原因,但这是个大坑啊!

相关推荐

  1. QT调节屏幕亮度

    2024-07-10 16:20:02       21 阅读
  2. 拯救者r9000 ubuntu20 屏幕亮度无法调节

    2024-07-10 16:20:02       72 阅读
  3. Android屏幕亮度

    2024-07-10 16:20:02       108 阅读
  4. OpenCV亮度对比度调节

    2024-07-10 16:20:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 16:20:02       51 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 16:20:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 16:20:02       44 阅读
  4. Python语言-面向对象

    2024-07-10 16:20:02       55 阅读

热门阅读

  1. Spring Boot手写starter

    2024-07-10 16:20:02       23 阅读
  2. 【国产开源可视化引擎Meta2d.js】视频

    2024-07-10 16:20:02       22 阅读
  3. Apache Doris的分区与分桶原理解析

    2024-07-10 16:20:02       14 阅读
  4. Stream流的简单用法

    2024-07-10 16:20:02       26 阅读
  5. liunx上修改Firefox版本号

    2024-07-10 16:20:02       17 阅读
  6. PS设计新手如何学习?沈阳PS设计线下培训

    2024-07-10 16:20:02       19 阅读
  7. 深度学习进阶

    2024-07-10 16:20:02       16 阅读
  8. 提示学习的本质是KNN

    2024-07-10 16:20:02       19 阅读
  9. Tomcat

    Tomcat

    2024-07-10 16:20:02      17 阅读
  10. pytorch 源码阅读(1)——torch.complie

    2024-07-10 16:20:02       15 阅读
  11. weapp.socket.io.js

    2024-07-10 16:20:02       14 阅读