当前位置: 首页 > news >正文

嵌入式 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");
}

在锁屏对话框的 showEventhideEvent 中调用这些函数:

// lockdialog.cpp
void LockDialog::showEvent(QShowEvent *) {turnOffBacklight();
}void LockDialog::hideEvent(QHideEvent *) {turnOnBacklight();
}

测试和验证

  1. 开机 Logo:设备上电后,Logo 应立即显示 1.5 秒,然后进入主界面。

  2. 无操作锁屏:设备静置 30 秒后,锁屏界面应自动弹出。

  3. 解锁:输入正确密码(1234),应返回主界面。

  4. 背光节能:锁屏时背光应关闭,解锁时背光应恢复。

总结

通过本文的步骤,你可以在嵌入式设备上实现开机 Logo 和无操作自动锁屏功能。这些功能不仅提升了用户体验,还优化了设备的能耗。

http://www.lryc.cn/news/596457.html

相关文章:

  • C语言面向对象编程
  • linux 环境服务发生文件句柄泄漏导致服务不可用
  • 自定义HAProxy 错误界面
  • 开发板系统烧写
  • 【数学建模|Matlab】Matlab「基础知识」和「基础操作」
  • Vue3 面试题及详细答案120道(31-45 )
  • Arraylist与LinkedList区别
  • MATLAB软件使用频繁,企业如何做到“少买多用”?
  • 论文略读:Towards Safer Large Language Models through Machine Unlearning
  • Go 的第一类对象与闭包
  • (二)Python基础入门-基础语法核心
  • 【Python】常见模块及其用法
  • 解决栅格数据裁剪矢量数据问题两种方法,ArcGIS解决与PYTHON解决
  • Leetcode力扣解题记录--第41题(原地哈希)
  • 力扣-300.最长递增子序列
  • LeetCode 633.平方数之和
  • Uni-App:跨平台开发的终极解决方案
  • uniapp app打包流程
  • 《Uniapp-Vue 3-TS 实战开发》自定义预约时间段组件
  • Java (Spring AI) 实现MCP server实现数据库的智能问答
  • MS523NA非接触式读卡器 IC
  • 【金融机器学习】第四章:风险-收益权衡——Bryan Kelly, 修大成(中文翻译)
  • 【方案】网页由微应用拼图,微前端
  • Node.js:RESPful API、多进程
  • 【STM32】CRC 校验函数
  • linux初识网络及UDP简单程序
  • 二、计算机网络技术——第3章:数据链路层
  • 基于卷积神经网络与小波变换的医学图像超分辨率算法复现
  • DeepSPV:一种从2D超声图像中估算3D脾脏体积的深度学习流程|文献速递-医学影像算法文献分享
  • zmaiFy来说软字幕和硬字幕有什么优缺点?