当前位置: 首页 > news >正文

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 每日一练 - RSTP响应端口故障后的处理流程
  • springsecurity(学习自用)
  • 【漏洞复现】29网课交单平台 SQL注入
  • HTML5+JavaScript单词游戏
  • 博美犬插画:成都亚恒丰创教育科技有限公司
  • 葵花奖见证品牌实力 乐橙旗舰智能锁公开首秀引全场热议
  • java-反射 2
  • Segmentation fault (core dumped)
  • 3.结果映射ResultMap(关联association+collection)
  • 图像分割入门-SegNet理论与实践
  • Github绑定自己的域名
  • C语言 -- 操作符详解​
  • tableau气泡图与词云图绘制 - 8
  • 芯片基识 | 掰开揉碎讲 FIFO(同步FIFO和异步FIFO)
  • PID控制与模糊PID控制的比较
  • ERLANG 网工修炼笔记 ---- UDP
  • ES6系统学习----从Apollo Client看解构赋值
  • Java超时控制的实现
  • Java程序员幽默爆笑锦集
  • MySQL-事务管理(基础)
  • MySQL主从复制读写分离及奇怪的问题
  • node 版本过低
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • webpack+react项目初体验——记录我的webpack环境配置
  • Web标准制定过程
  • 动态魔术使用DBMS_SQL
  • 分类模型——Logistics Regression
  • 计算机在识别图像时“看到”了什么?
  • 我与Jetbrains的这些年
  • 项目实战-Api的解决方案
  • 一道闭包题引发的思考
  • 异常机制详解
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • #android不同版本废弃api,新api。
  • #VERDI# 关于如何查看FSM状态机的方法
  • $.ajax()
  • (003)SlickEdit Unity的补全
  • (1)虚拟机的安装与使用,linux系统安装
  • (3)nginx 配置(nginx.conf)
  • (35)远程识别(又称无人机识别)(二)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (NSDate) 时间 (time )比较
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (利用IDEA+Maven)定制属于自己的jar包
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (转)可以带来幸福的一本书
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转载)Linux 多线程条件变量同步
  • .Net6使用WebSocket与前端进行通信
  • .NET委托:一个关于C#的睡前故事