在嵌入式設備開發中,為設備添加開機 Logo 和無操作自動鎖屏功能是提升用戶體驗的重要環節。本文將詳細介紹如何在 Qt 嵌入式項目中實現這兩個功能。我們將使用 Qt 5/6 和 Linux 環境,確保代碼的可移植性和通用性。
項目結構
為了實現這兩個功能,我們將創建一個簡單的項目結構:
project/
├── main.cpp
├── splash.h
├── splash.cpp
├── globalapplication.h
├── globalapplication.cpp
├── lockdialog.h
├── lockdialog.cpp
├── lockdialog.ui
├── icons/logo.png
└── CMakeLists.txt
Step 1:開機 Logo
1.1 準備 Logo 圖片
將你的 Logo 圖片放在 icons/logo.png
,并確保它是一個透明背景的 PNG 圖片。
1.2 創建 Splash 窗口
創建一個簡單的 Splash 窗口,用于顯示 Logo。
// splash.h
#pragma once
#include <QWidget>class Splash : public QWidget {Q_OBJECT
public:explicit Splash(QWidget *parent = nullptr);
};
// splash.cpp
#include "splash.h"
#include <QLabel>
#include <QVBoxLayout>
#include <QPixmap>Splash::Splash(QWidget *parent) : QWidget(parent) {setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);setAttribute(Qt::WA_TranslucentBackground);auto *layout = new QVBoxLayout(this);auto *logo = new QLabel(this);logo->setPixmap(QPixmap(":/icons/logo.png").scaled(this->size(), Qt::KeepAspectRatio));logo->setAlignment(Qt::AlignCenter);layout->addWidget(logo);resize(logo->pixmap().size());
}
?
1.3 在主函數中顯示 Splash
在 main.cpp
中,先顯示 Splash 窗口,等待 1.5 秒后關閉并顯示主窗口。
// main.cpp
#include <QApplication>
#include "splash.h"
#include "mainwindow.h"int main(int argc, char *argv[]) {QApplication app(argc, argv);Splash splash;splash.showFullScreen();app.processEvents();QThread::msleep(1500); // 顯示 1.5 秒splash.close();MainWindow w;w.show();return app.exec();
}
?
Step 2:無操作自動鎖屏
2.1 創建全局事件過濾器
創建一個全局事件過濾器,用于檢測用戶活動并重置計時器。
// globalapplication.h
#pragma once
#include <QApplication>
#include <QTimer>class LockDialog;class GlobalApplication : public QApplication {Q_OBJECT
public:explicit GlobalApplication(int &argc, char **argv);
protected:bool notify(QObject *obj, QEvent *e) override;
private slots:void onTimeOut();
private:QTimer *m_idleTimer;LockDialog *m_lockDlg;
};
// globalapplication.cpp
#include "globalapplication.h"
#include "lockdialog.h"
#include <QEvent>GlobalApplication::GlobalApplication(int &argc, char **argv): QApplication(argc, argv) {m_idleTimer = new QTimer(this);m_idleTimer->setInterval(30000); // 30 秒connect(m_idleTimer, &QTimer::timeout, this, &GlobalApplication::onTimeOut);m_idleTimer->start();m_lockDlg = new LockDialog(nullptr);
}bool GlobalApplication::notify(QObject *obj, QEvent *e) {if (e->type() == QEvent::MouseButtonPress ||e->type() == QEvent::MouseMove ||e->type() == QEvent::TouchBegin ||e->type() == QEvent::KeyPress) {m_idleTimer->stop();m_idleTimer->start();}return QApplication::notify(obj, e);
}void GlobalApplication::onTimeOut() {m_lockDlg->showFullScreen();
}
2.2 創建鎖屏對話框
使用 Qt Designer 創建一個簡單的鎖屏對話框,包含一個密碼輸入框和一個解鎖按鈕。
// lockdialog.h
#pragma once
#include <QDialog>namespace Ui {
class LockDialog;
}class LockDialog : public QDialog {Q_OBJECT
public:explicit LockDialog(QWidget *parent = nullptr);~LockDialog();
private slots:void on_unlockButton_clicked();
private:Ui::LockDialog *ui;
};
// lockdialog.cpp
#include "lockdialog.h"
#include "ui_lockdialog.h"LockDialog::LockDialog(QWidget *parent) :QDialog(parent),ui(new Ui::LockDialog) {ui->setupUi(this);setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);setModal(true);
}LockDialog::~LockDialog() {delete ui;
}void LockDialog::on_unlockButton_clicked() {if (ui->passwordLineEdit->text() == "1234") {accept();} else {ui->statusLabel->setText("密碼錯誤");ui->passwordLineEdit->clear();}
}
2.3 修改主函數
在 main.cpp
中,將 QApplication
替換為 GlobalApplication
。
// main.cpp
#include "globalapplication.h"
#include "mainwindow.h"
#include "splash.h"int main(int argc, char *argv[]) {GlobalApplication app(argc, argv);Splash splash;splash.showFullScreen();app.processEvents();QThread::msleep(1500); // 顯示 1.5 秒splash.close();MainWindow w;w.show();return app.exec();
}
Step 3:背光節能(可選)
在嵌入式設備中,背光節能是一個重要的優化點。我們可以通過簡單的命令關閉背光。
void turnOffBacklight() {QProcess::execute("echo 0 > /sys/class/backlight/backlight/bl_power");
}void turnOnBacklight() {QProcess::execute("echo 1 > /sys/class/backlight/backlight/bl_power");
}
在鎖屏對話框的 showEvent
和 hideEvent
中調用這些函數:
// lockdialog.cpp
void LockDialog::showEvent(QShowEvent *) {turnOffBacklight();
}void LockDialog::hideEvent(QHideEvent *) {turnOnBacklight();
}
測試和驗證
開機 Logo:設備上電后,Logo 應立即顯示 1.5 秒,然后進入主界面。
無操作鎖屏:設備靜置 30 秒后,鎖屏界面應自動彈出。
解鎖:輸入正確密碼(1234),應返回主界面。
背光節能:鎖屏時背光應關閉,解鎖時背光應恢復。
總結
通過本文的步驟,你可以在嵌入式設備上實現開機 Logo 和無操作自動鎖屏功能。這些功能不僅提升了用戶體驗,還優化了設備的能耗。