Berbagi teknologi

QT menyesuaikan kecerahan layar

2024-07-12

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

1. Tujuan

Gunakan QT untuk mewujudkan fungsi penyesuaian kecerahan layar: bila tidak ada layar atau sentuhan, kecerahan layar diturunkan, dan jika ada sentuhan, kecerahan layar disesuaikan ke paling terang.

2. Sesuaikan perintah kecerahan

Perangkat target menggunakan sistem Linux tertanam, dan perintah untuk mengatur kecerahan layar adalah:

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

Tidak ada masalah dalam menjalankan perintah ini menggunakan terminal. Namun, saat menggunakan QProcess untuk menjalankan perintah ini, tidak ada respons atau pesan kesalahan apa pun.

Akhirnya saya menemukan bahwa saya perlu menggunakan perintah ini:

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

Kode program diimplementasikan sebagai berikut:

  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. Deteksi peristiwa sentuhan/mouse untuk mengaktifkan layar

3.1.Deskripsi fungsi

Jika layar tidak diklik selama jangka waktu tertentu, layar akan meredup atau mati. Jika ada peristiwa sentuhan (yaitu tekan/gerakan mouse), bangunkan dan nyalakan layar.

3.2. Metode implementasi ketika ada jendela

Jika ada jendela, implementasinya relatif sederhana. Cukup terapkan respons peristiwa mouse di kelas kontrol jendela. Contoh kodenya adalah sebagai berikut:

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

Catatan: Peristiwa mouse hanya dapat ditanggapi dalam kontrol jendela. Anda dapat menggunakan kelas QApplication untuk merespons kejadian di luar kontrol jendela.

Masalah: Ketika jendela layar penuh dan diatur ke transparan, layar tidak dapat dihidupkan setelah dimatikan.

3.3. Metode implementasi ketika tidak ada jendela

3.3.1. Implementasi menggunakan fungsi kelas QApplication

Contoh kodenya adalah sebagai berikut:

  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. Menggunakan fungsi filter peristiwa

Contoh kodenya adalah sebagai berikut:

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

Seperti yang Anda lihat dari komentar di atas, ketika tidak ada jendela, peristiwa klik mouse atau sentuhan tidak sama dengan peristiwa mouse yang ditentukan oleh QT, tetapi peristiwa QEvent::SockAct!

Adapun mengapa hal ini terjadi, alasannya belum ditemukan, tetapi ini adalah lubang besar!