2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Verwenden Sie QT, um die Funktion zum Anpassen der Bildschirmhelligkeit zu realisieren: Wenn kein Bildschirm oder keine Berührung vorhanden ist, wird die Bildschirmhelligkeit verringert, und wenn eine Berührung erfolgt, wird die Bildschirmhelligkeit auf die hellste Stufe eingestellt.
Das Zielgerät verwendet ein eingebettetes Linux-System und der Befehl zum Anpassen der Bildschirmhelligkeit lautet:
echo x > /sys/class/backlight/backlight/brightness #x范围为0~10
Es ist kein Problem, diesen Befehl über das Terminal auszuführen. Wenn Sie diesen Befehl jedoch mit QProcess ausführen, erfolgt keine Antwort oder Fehlermeldung.
Schließlich habe ich festgestellt, dass ich diesen Befehl verwenden muss:
/bin/sh -c "echo x > /sys/class/backlight/backlight/brightness" #x为亮度值
Der Programmcode ist wie folgt implementiert:
- QProcess setBright(this);// 进程函数,调用外部指令窗口
- setBright.start("cat /sys/class/backlight/backlight/brightness n"); #获取当前亮度值
- setBright.waitForFinished(); // 等待命令执行完成
- QString strCmd = QString("/bin/sh -c "echo %1 > /sys/class/backlight/backlight/brightness"").arg(brightness/10);
- //执行指令
- setBright.start(strCmd.toLocal8Bit().data()); //convert QString to char
- setBright.waitForFinished(1000);// 等待指令执行完毕
- QString strErrors = setBright.readAllStandardError();// 获取返回值
- qDebug()<<strErrors;
Wenn über einen längeren Zeitraum nicht auf den Bildschirm geklickt wird, wird der Bildschirm abgedunkelt oder ausgeschaltet. Wenn es ein Berührungsereignis (d. h. Drücken/Bewegen der Maus) gibt, werden Sie geweckt und der Bildschirm wird beleuchtet.
Wenn ein Fenster vorhanden ist, ist die Implementierung relativ einfach. Implementieren Sie einfach die Reaktion auf Mausereignisse in der Fenstersteuerungsklasse. Der Beispielcode lautet wie folgt:
- //h
- protected:
- void mousePressEvent(QMouseEvent *event);
- void mouseMoveEvent(QMouseEvent *event);
- void mouseReleaseEvent(QMouseEvent *event);
- //cpp
- void MainWindow::mousePressEvent(QMouseEvent *event)
- {
- qDebug() << "Mouse pressed";
- mScreenSleep->ToWake(); //唤醒屏幕
- }
- void MainWindow::mouseMoveEvent(QMouseEvent *event)
- {
- qDebug() << "Mouse moved";
- mScreenSleep->ToWake(); //唤醒屏幕
- }
- void MainWindow::mouseReleaseEvent(QMouseEvent *event)
- {
- qDebug() << "Mouse released";
- mScreenSleep->ToWake(); //唤醒屏幕
- }
Hinweis: Auf Mausereignisse kann nur innerhalb von Fenstersteuerelementen reagiert werden. Sie können die QApplication-Klasse verwenden, um auf Ereignisse außerhalb der Fenstersteuerung zu reagieren.
Problem: Wenn das Fenster im Vollbildmodus angezeigt und auf transparent eingestellt ist, kann der Bildschirm nach dem Ausschalten nicht mehr eingeschaltet werden.
Der Beispielcode lautet wie folgt:
- //h
- #ifndef GLOBALAPP_H
- #define GLOBALAPP_H
-
- #include <QApplication>
- #include "screensleep.h" //屏幕亮度控制类
-
- class globalapp : public QApplication
- {
- public:
- globalapp(int &argc,char **argv);
- ~globalapp();
- ScreenSleep *mScreenSleep;
-
- bool notify(QObject*, QEvent *);
- };
-
- #endif // GLOBALAPP_H
-
- //cpp
- #include "globalapp.h"
- #include <QDebug>
-
- globalapp::globalapp(int &argc,char **argv):QApplication(argc,argv)
- {
- mScreenSleep = new ScreenSleep(this);
- }
- globalapp::~globalapp()
- {
- delete mScreenSleep;
- }
- bool globalapp::notify(QObject *obj, QEvent *e)
- {
- if(e->type() == QEvent::KeyPress || e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseMove)
- {
- mScreenSleep->ToWake();
- }
- else if(e->type() == QEvent::SockAct) //为什么响应的是这个事件???
- {
- mScreenSleep->ToWake();
- }
- return QApplication::notify(obj,e);
- }
- //main
- int main(int argc, char *argv[])
- {
- globalapp a(argc, argv); //使用自建的QApplication对象
- return a.exec();
- }
Der Beispielcode lautet wie folgt:
- #include <QApplication>
- #include <QMouseEvent>
- #include <QDebug>
-
- class MouseHook : public QObject {
- bool eventFilter(QObject *obj, QEvent *event) override {
- if (event->type() == QEvent::MouseMove) {
- QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
- //放置事件处理
- }
- else if(event->type() == QEvent::SockAct)
- {
- QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
- //放置事件处理
- }
- return QObject::eventFilter(obj, event);
- }
- };
- int main(int argc, char *argv[])
- {
- MouseHook mouseHook;
- a.installEventFilter(&mouseHook);
- return a.exec();
- }
Wie Sie den obigen Kommentaren entnehmen können, entspricht das Mausklick- oder Berührungsereignis, wenn kein Fenster vorhanden ist, nicht dem von QT definierten Mausereignis, sondern einem QEvent::SockAct-Ereignis!
Warum das so ist, ist noch nicht geklärt, aber es ist ein großes Loch!