Κοινή χρήση τεχνολογίας

Το 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!

Όσο για το γιατί συμβαίνει αυτό, ο λόγος δεν έχει βρεθεί ακόμα, αλλά είναι μεγάλη τρύπα!