기술나눔

QT는 화면 밝기를 조정합니다

2024-07-12

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

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为亮度值

프로그램 코드는 다음과 같이 구현됩니다.

  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. 터치/마우스 이벤트를 감지하여 화면을 깨웁니다.

3.1.기능 설명

일정 시간 동안 화면을 클릭하지 않으면 화면이 어두워지거나 꺼집니다. 터치(예: 마우스 누르기/이동) 이벤트가 발생하면 화면을 깨우고 켜집니다.

3.2.창이 있는 경우의 구현 방법

창이 있는 경우 구현은 비교적 간단합니다. 창 컨트롤 클래스에서 마우스 이벤트 응답을 구현하면 됩니다. 샘플 코드는 다음과 같습니다.

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

참고: 마우스 이벤트는 창 컨트롤 내에서만 응답할 수 있습니다. QApplication 클래스를 사용하여 창 제어 외부의 이벤트에 응답할 수 있습니다.

문제: 창이 전체 화면이고 투명으로 설정된 경우 화면을 끈 후 다시 켤 수 없습니다.

3.3.창이 없을 때의 구현 방법

3.3.1. QApplication 클래스 함수를 이용한 구현

샘플 코드는 다음과 같습니다.

  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. 이벤트 필터 기능 사용하기

샘플 코드는 다음과 같습니다.

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

위의 설명에서 볼 수 있듯이 창이 없을 때 마우스 클릭이나 터치 이벤트는 QT에서 정의한 마우스 이벤트와 동일하지 않지만 QEvent::SockAct 이벤트입니다!

왜 이런 일이 일어나는지는 아직까지 원인은 밝혀지지 않았지만 큰 구멍입니다!