Partage de technologie

QT ajuster la luminosité de l'écran

2024-07-12

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

1. Objectif

Utilisez QT pour réaliser la fonction de réglage de la luminosité de l'écran : lorsqu'il n'y a pas d'écran ou de contact, la luminosité de l'écran est réduite, et s'il y a un contact, la luminosité de l'écran est ajustée au plus lumineux.

2. Ajuster la commande de luminosité

Le périphérique cible utilise un système Linux intégré et la commande pour régler la luminosité de l'écran est :

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

Il n'y a aucun problème pour exécuter cette commande à l'aide du terminal. Cependant, lorsque vous utilisez QProcess pour exécuter cette commande, il n'y a aucune réponse ni aucun message d'erreur.

Finalement, j'ai découvert que je devais utiliser cette commande :

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

Le code du programme est implémenté comme suit :

  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. Détecter les événements tactiles/souris pour réveiller l'écran

3.1.Description des fonctions

Si l'on ne clique pas sur l'écran pendant un certain temps, l'écran sera atténué ou éteint. S'il y a un événement tactile (c'est-à-dire une pression/un déplacement de la souris), réveillez-vous et allumez l'écran.

3.2. Méthode de mise en œuvre lorsqu'il y a une fenêtre

Lorsqu’il y a une fenêtre, la mise en œuvre est relativement simple. Implémentez simplement la réponse aux événements de la souris dans la classe de contrôle de fenêtre. L'exemple de code est le suivant :

  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. }

Remarque : Les événements de souris ne peuvent recevoir une réponse que dans les contrôles de fenêtre. Vous pouvez utiliser la classe QApplication pour répondre aux événements en dehors du contrôle de fenêtre.

Problème : Lorsque la fenêtre est en plein écran et définie sur transparente, l'écran ne peut pas être allumé après avoir été éteint.

3.3. Méthode de mise en œuvre lorsqu'il n'y a pas de fenêtre

3.3.1. Implémentation à l'aide de la fonction de classe QApplication

L'exemple de code est le suivant :

  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. Utilisation de la fonction de filtre d'événements

L'exemple de code est le suivant :

  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. }

Comme vous pouvez le voir dans les commentaires ci-dessus, lorsqu'il n'y a pas de fenêtre, l'événement clic ou toucher de la souris n'est pas égal à l'événement souris défini par QT, mais à un événement QEvent::SockAct !

Quant à savoir pourquoi c'est le cas, la raison n'a pas encore été trouvée, mais c'est un gros trou !