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事件!

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

相关推荐
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner2 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz7 天前
QML Hello World 入门示例
qt
xcyxiner10 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner11 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner12 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00614 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术14 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript