2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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.
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 :
- 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;
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.
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 :
- //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(); //唤醒屏幕
- }
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.
L'exemple de code est le suivant :
- //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();
- }
L'exemple de code est le suivant :
- #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();
- }
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 !