τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Χρησιμοποιήστε το QT για να πραγματοποιήσετε τη λειτουργία προσαρμογής της φωτεινότητας της οθόνης: όταν δεν υπάρχει οθόνη ή άγγιγμα, η φωτεινότητα της οθόνης μειώνεται και εάν υπάρχει αφή, η φωτεινότητα της οθόνης ρυθμίζεται στο πιο φωτεινό.
Η συσκευή-στόχος χρησιμοποιεί ένα ενσωματωμένο σύστημα Linux και η εντολή για τη ρύθμιση της φωτεινότητας της οθόνης είναι:
echo x > /sys/class/backlight/backlight/brightness #x范围为0~10
Δεν υπάρχει πρόβλημα στην εκτέλεση αυτής της εντολής χρησιμοποιώντας το τερματικό. Ωστόσο, όταν χρησιμοποιείτε το QProcess για την εκτέλεση αυτής της εντολής, δεν υπάρχει απάντηση ή μήνυμα σφάλματος.
Τελικά βρήκα ότι πρέπει να χρησιμοποιήσω αυτήν την εντολή:
/bin/sh -c "echo x > /sys/class/backlight/backlight/brightness" #x为亮度值
Ο κώδικας του προγράμματος υλοποιείται ως εξής:
- 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;
Εάν δεν γίνει κλικ στην οθόνη για κάποιο χρονικό διάστημα, η οθόνη θα χαμηλώσει ή θα απενεργοποιηθεί. Εάν υπάρχει ένα συμβάν αφής (δηλαδή πάτημα/μετακίνηση του ποντικιού), αφυπνίστε και ανάψτε την οθόνη.
Όταν υπάρχει παράθυρο, η υλοποίηση είναι σχετικά απλή. Απλώς εφαρμόστε την απόκριση συμβάντος του ποντικιού στην κλάση ελέγχου παραθύρου. Το δείγμα κώδικα έχει ως εξής:
- //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(); //唤醒屏幕
- }
Σημείωση: Τα συμβάντα του ποντικιού μπορούν να απαντηθούν μόνο εντός των στοιχείων ελέγχου παραθύρου. Μπορείτε να χρησιμοποιήσετε την κλάση QApplication για να απαντήσετε σε συμβάντα εκτός του στοιχείου ελέγχου παραθύρου.
Πρόβλημα: Όταν το παράθυρο είναι σε πλήρη οθόνη και έχει οριστεί σε διαφανές, η οθόνη δεν μπορεί να ενεργοποιηθεί μετά την απενεργοποίηση.
Το δείγμα κώδικα έχει ως εξής:
- //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();
- }
Το δείγμα κώδικα έχει ως εξής:
- #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();
- }
Όπως μπορείτε να δείτε από τα παραπάνω σχόλια, όταν δεν υπάρχει παράθυρο, το συμβάν κλικ ή άγγιγμα του ποντικιού δεν είναι ίσο με το συμβάν του ποντικιού που ορίζεται από το QT, αλλά ένα συμβάν QEvent::SockAct!
Όσο για το γιατί συμβαίνει αυτό, ο λόγος δεν έχει βρεθεί ακόμα, αλλά είναι μεγάλη τρύπα!