当前位置: 首页 > 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.dtcms.com/a/292559.html

相关文章:

  • 项目集成zustand后,如何构建和使用,以及devtools函数。
  • 新能源工厂的可视化碳中和实验:碳足迹追踪看板与能源调度策略仿真
  • React 项目性能瓶颈分析
  • SCSAI项目管理智能体设计方案核心设计思路:分层开放架构
  • GitOps实践:基于Argo CD的Kubernetes集群应用持续交付实战指南
  • 智慧能源驱动数字孪生重介选煤新模式探索
  • 力扣 78.子集
  • 【element-ui el-table】多选表格勾选时默认勾选了全部,row-key绑定异常问题解决
  • EasyMan 数字人服务全面焕新,交互型AI数字人助推孪生体验全新升级
  • 等保2.0详解:筑牢数字时代安全基石
  • 【GIT】基础知识及基本应用
  • 如何加固Endpoint Central服务器的安全?(上)
  • Linux驱动-中断-共享队列
  • 【size_t 类型转换】ans = max(ans, (int)occ.size());
  • 公司内部网址怎么在外网打开?如何让外网访问内网的网站呢?
  • qtbase5-dev库使用介绍
  • 5.6 指令流水线 (答案见原书 P267)
  • windows10设置了软件开机自启,为啥不自启动
  • iOS 抓包工具有哪些?场景导向下的工具推荐与实战对比
  • Vue3 面试题及详细答案120道(16-30 )
  • SonarQube+Git
  • Dify-13: 文本生成API端点
  • 使用mybatis实现模糊查询和精准查询切换的功能
  • Cy3-NH2 花菁染料Cy3-氨基,星戈瑞
  • CMOS知识点 物理气相沉积
  • ECMAScript(简称 ES)和 JavaScript 的关系
  • Qt文件操作:读写文件的各种方法
  • 如何安装没有install.exe的mysql数据库文件
  • uniapp打开导航软件并定位到目标位置的实现
  • k8s:离线部署tomcatV11.0.9,报Cannot find /opt/bitnami/tomcat/bin/setclasspath.sh