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