在嵌入式设备开发中,为设备添加开机 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 和无操作自动锁屏功能。这些功能不仅提升了用户体验,还优化了设备的能耗。