嵌入式 Qt 开发:实现开机 Logo 和无操作自动锁屏

发布于:2025-07-23 ⋅ 阅读:(13) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到