Compartir tecnología

QT ajusta el brillo de la pantalla

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Objetivo

Utilice QT para realizar la función de ajustar el brillo de la pantalla: cuando no hay pantalla o toque, el brillo de la pantalla se reduce y, si hay toque, el brillo de la pantalla se ajusta al máximo.

2. Ajustar el comando de brillo

El dispositivo de destino utiliza un sistema Linux integrado y el comando para ajustar el brillo de la pantalla es:

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

No hay ningún problema en ejecutar este comando usando la terminal. Sin embargo, cuando se utiliza QProcess para ejecutar este comando, no hay respuesta ni mensaje de error.

Finalmente descubrí que necesito usar este comando:

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

El código del programa se implementa de la siguiente manera:

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

3. Detectar eventos táctiles/de mouse para activar la pantalla

3.1. Descripción de la función

Si no se hace clic en la pantalla durante un período de tiempo, la pantalla se atenuará o se apagará. Si hay un evento táctil (es decir, presionar/mover el mouse), despierta e ilumina la pantalla.

3.2. Método de implementación cuando hay una ventana.

Cuando hay una ventana, la implementación es relativamente simple. Simplemente implemente la respuesta al evento del mouse en la clase de control de ventana. El código de muestra es el siguiente:

  1. //h
  2. protected:
  3. void mousePressEvent(QMouseEvent *event);
  4. void mouseMoveEvent(QMouseEvent *event);
  5. void mouseReleaseEvent(QMouseEvent *event);
  6. //cpp
  7. void MainWindow::mousePressEvent(QMouseEvent *event)
  8. {
  9. qDebug() << "Mouse pressed";
  10. mScreenSleep->ToWake(); //唤醒屏幕
  11. }
  12. void MainWindow::mouseMoveEvent(QMouseEvent *event)
  13. {
  14. qDebug() << "Mouse moved";
  15. mScreenSleep->ToWake(); //唤醒屏幕
  16. }
  17. void MainWindow::mouseReleaseEvent(QMouseEvent *event)
  18. {
  19. qDebug() << "Mouse released";
  20. mScreenSleep->ToWake(); //唤醒屏幕
  21. }

Nota: Los eventos del mouse solo se pueden responder dentro de los controles de la ventana. Puede utilizar la clase QApplication para responder a eventos fuera del control de la ventana.

Problema: cuando la ventana está en pantalla completa y configurada como transparente, la pantalla no se puede encender después de apagarla.

3.3. Método de implementación cuando no hay ventana.

3.3.1. Implementación usando la función de clase QApplication

El código de muestra es el siguiente:

  1. //h
  2. #ifndef GLOBALAPP_H
  3. #define GLOBALAPP_H
  4. #include <QApplication>
  5. #include "screensleep.h" //屏幕亮度控制类
  6. class globalapp : public QApplication
  7. {
  8. public:
  9. globalapp(int &argc,char **argv);
  10. ~globalapp();
  11. ScreenSleep *mScreenSleep;
  12. bool notify(QObject*, QEvent *);
  13. };
  14. #endif // GLOBALAPP_H
  15. //cpp
  16. #include "globalapp.h"
  17. #include <QDebug>
  18. globalapp::globalapp(int &argc,char **argv):QApplication(argc,argv)
  19. {
  20. mScreenSleep = new ScreenSleep(this);
  21. }
  22. globalapp::~globalapp()
  23. {
  24. delete mScreenSleep;
  25. }
  26. bool globalapp::notify(QObject *obj, QEvent *e)
  27. {
  28. if(e->type() == QEvent::KeyPress || e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseMove)
  29. {
  30. mScreenSleep->ToWake();
  31. }
  32. else if(e->type() == QEvent::SockAct) //为什么响应的是这个事件???
  33. {
  34. mScreenSleep->ToWake();
  35. }
  36. return QApplication::notify(obj,e);
  37. }
  38. //main
  39. int main(int argc, char *argv[])
  40. {
  41. globalapp a(argc, argv); //使用自建的QApplication对象
  42. return a.exec();
  43. }

3.3.2. Uso de la función de filtro de eventos

El código de muestra es el siguiente:

  1. #include <QApplication>
  2. #include <QMouseEvent>
  3. #include <QDebug>
  4. class MouseHook : public QObject {
  5. bool eventFilter(QObject *obj, QEvent *event) override {
  6. if (event->type() == QEvent::MouseMove) {
  7. QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
  8. //放置事件处理
  9. }
  10. else if(event->type() == QEvent::SockAct)
  11. {
  12. QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
  13. //放置事件处理
  14. }
  15. return QObject::eventFilter(obj, event);
  16. }
  17. };
  18. int main(int argc, char *argv[])
  19. {
  20. MouseHook mouseHook;
  21. a.installEventFilter(&mouseHook);
  22. return a.exec();
  23. }

Como puede ver en los comentarios anteriores, cuando no hay ventana, el evento táctil o de clic del mouse no es igual al evento del mouse definido por QT, sino a un evento QEvent::SockAct.

En cuanto a por qué es así, aún no se ha encontrado el motivo, ¡pero es un gran agujero!