完整的 SquareStudio 注册登录功能实现方案:已经烧录到开发板正常使用

根据你的需求,我将提供完整的实现方案,解决按钮同时执行多个动作的问题,并确保注册登录功能正常工作。

所需文件结构

需要创建和修改的文件如下:

  1. ui_events.h - 事件处理函数声明
  2. events.c - 实际的事件处理逻辑
  3. ui.c - UI 初始化和事件绑定
  4. 确保CMakeLists.txtfilelist.txt包含新文件

详细步骤

第一步:创建 ui_events.h 文件

#ifndef _UI_EVENTS_H
#define _UI_EVENTS_H#ifdef __cplusplus
extern "C" {
#endif// 注册按钮事件处理函数
void event_register_btn(lv_event_t * e);// 登录按钮事件处理函数
void event_login_btn(lv_event_t * e);#ifdef __cplusplus
} /*extern "C"*/
#endif#endif

操作:在项目中创建此文件,用于声明事件处理函数。

第二步:创建 events.c 文件

#include "ui.h"
#include "ui_helpers.h"
#include "ui_events.h"
#include <string.h>// 模拟用户数据库
typedef struct {char username[50];char password[50];
} User;// 简单的用户存储(实际应用中应使用持久化存储)
static User users[10];
static int user_count = 0;// 声明回调函数(放在使用前)
static void hide_error_panel(lv_timer_t *timer);
static void hide_success_panel_and_go_welcome(lv_timer_t *timer);// 检查用户名是否已存在
static bool is_username_exists(const char* username) {for(int i = 0; i < user_count; i++) {if(strcmp(users[i].username, username) == 0) {return true;}}return false;
}// 验证用户凭据
static bool validate_user(const char* username, const char* password) {for(int i = 0; i < user_count; i++) {if(strcmp(users[i].username, username) == 0 && strcmp(users[i].password, password) == 0) {return true;}}return false;
}// 添加新用户
static void add_user(const char* username, const char* password) {if(user_count < 10) {strncpy(users[user_count].username, username, 49);users[user_count].username[49] = '\0'; // 确保字符串结束strncpy(users[user_count].password, password, 49);users[user_count].password[49] = '\0'; // 确保字符串结束user_count++;}
}// 错误面板自动隐藏回调
static void hide_error_panel(lv_timer_t *timer) {lv_obj_add_flag(ui_Panel6, LV_OBJ_FLAG_HIDDEN);lv_timer_del(timer); // 删除定时器自身
}// 成功面板自动隐藏并跳转页面回调
static void hide_success_panel_and_go_welcome(lv_timer_t *timer) {lv_obj_add_flag(ui_Panel3, LV_OBJ_FLAG_HIDDEN);_ui_screen_change(&ui_welcomeUI, LV_SCR_LOAD_ANIM_FADE_ON, 500, 0, ui_welcomeUI_screen_init);lv_timer_del(timer); // 删除定时器自身
}// 注册按钮事件处理
void event_register_btn(lv_event_t * e) {// 阻止事件传播(LVGL v8.2 常用此函数)lv_event_stop_bubbling(e);// 获取输入框内容const char *username = lv_textarea_get_text(ui_uiTextAreaUsername);const char *password = lv_textarea_get_text(ui_uiTextAreaPassword);// 验证输入if(strlen(username) == 0 || strlen(password) == 0) {// 输入为空,显示错误面板lv_obj_clear_flag(ui_Panel6, LV_OBJ_FLAG_HIDDEN);// 3秒后隐藏错误面板(使用C风格回调)lv_timer_create(hide_error_panel, 3000, NULL);} else if(is_username_exists(username)) {// 用户名已存在,显示错误面板lv_obj_clear_flag(ui_Panel6, LV_OBJ_FLAG_HIDDEN);// 3秒后隐藏错误面板lv_timer_create(hide_error_panel, 3000, NULL);} else {// 注册成功,添加用户add_user(username, password);// 显示成功面板lv_obj_clear_flag(ui_Panel3, LV_OBJ_FLAG_HIDDEN);// 2秒后跳转到欢迎页面并隐藏成功面板lv_timer_create(hide_success_panel_and_go_welcome, 2000, NULL);}// 清空输入框lv_textarea_set_text(ui_uiTextAreaUsername, "");lv_textarea_set_text(ui_uiTextAreaPassword, "");
}// 登录按钮事件处理
void event_login_btn(lv_event_t * e) {// 获取输入框内容const char *username = lv_textarea_get_text(ui_uiTextAreaUsername);const char *password = lv_textarea_get_text(ui_uiTextAreaPassword);// 验证用户if(validate_user(username, password)) {// 登录成功,显示成功面板lv_obj_clear_flag(ui_Panel3, LV_OBJ_FLAG_HIDDEN);// 2秒后跳转到欢迎页面并隐藏成功面板lv_timer_create(hide_success_panel_and_go_welcome, 2000, NULL);} else {// 登录失败,显示错误面板lv_obj_clear_flag(ui_Panel6, LV_OBJ_FLAG_HIDDEN);// 3秒后隐藏错误面板lv_timer_create(hide_error_panel, 3000, NULL);}// 清空输入框lv_textarea_set_text(ui_uiTextAreaUsername, "");lv_textarea_set_text(ui_uiTextAreaPassword, "");
}

操作:创建此文件,实现注册和登录的核心逻辑。代码中使用lv_event_stop_propagation(e)来阻止 SquareStudio 设置的默认动作,解决按钮同时执行多个动作的问题。

第三步:修改 ui.c 文件

找到ui_init()函数,添加以下代码:

// 在ui_init()函数中添加以下代码// 确保面板初始状态为隐藏
lv_obj_add_flag(ui_Panel3, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(ui_Panel6, LV_OBJ_FLAG_HIDDEN);// 设置密码框模式
lv_textarea_set_password_mode(ui_uiTextAreaPassword, true);
lv_textarea_set_one_line(ui_uiTextAreaUsername, true);
lv_textarea_set_one_line(ui_uiTextAreaPassword, true);// 移除可能存在的旧事件回调
lv_obj_remove_event_dsc(ui_uiButtonRegistration, NULL);
lv_obj_remove_event_dsc(ui_uiButtonLogin, NULL);// 绑定新的事件处理函数
lv_obj_add_event_cb(ui_uiButtonRegistration, event_register_btn, LV_EVENT_CLICKED, NULL);
lv_obj_add_event_cb(ui_uiButtonLogin, event_login_btn, LV_EVENT_CLICKED, NULL);

操作:在现有ui.c文件的ui_init()函数中添加上述代码,确保在 UI 初始化时正确设置组件属性并绑定事件处理函数。

第四步:更新 CMakeLists.txt

SET(SOURCES screens/ui_loginUI.cscreens/ui_welcomeUI.cscreens/ui_deskUI.cscreens/ui_waitUI.cscreens/ui_gameUI.cscreens/ui_game1UI.cscreens/ui_game2UI.cscreens/ui_Screen8.cscreens/ui_Screen9.cscreens/ui_pictureUI.cui.cui_events.h  # 添加头文件events.c     # 添加事件处理文件components/ui_comp_hook.cui_helpers.cimages/ui_img_window_png.cimages/ui_img_car1_png.cimages/ui_img_car2_png.cimages/ui_img_kun_png.cimages/ui_img_desk_png.cimages/ui_img_cat_png.cimages/ui_img_woman_png.cimages/ui_img_car3_png.cfonts/ui_font_Font32.cfonts/ui_font_Font16.c)add_library(ui ${SOURCES})

操作:修改项目的CMakeLists.txt,添加新创建的ui_events.hevents.c文件。

第五步:更新 filelist.txt

screens/ui_loginUI.c
screens/ui_welcomeUI.c
screens/ui_deskUI.c
screens/ui_waitUI.c
screens/ui_gameUI.c
screens/ui_game1UI.c
screens/ui_game2UI.c
screens/ui_Screen8.c
screens/ui_Screen9.c
screens/ui_pictureUI.c
ui.c
ui_events.h  # 添加头文件
events.c     # 添加事件处理文件
components/ui_comp_hook.c
ui_helpers.c
images/ui_img_window_png.c
images/ui_img_car1_png.c
images/ui_img_car2_png.c
images/ui_img_kun_png.c
images/ui_img_desk_png.c
images/ui_img_cat_png.c
images/ui_img_woman_png.c
images/ui_img_car3_png.c
fonts/ui_font_Font32.c
fonts/ui_font_Font16.c

操作:修改filelist.txt,添加新创建的文件。

第六步:在 SquareStudio 中移除默认事件

  1. 打开 SquareStudio,加载你的项目
  2. 找到注册按钮uiButtonRegistration
  3. 检查并移除在 SquareStudio 中为该按钮设置的所有事件(特别是点击事件)
  4. 对登录按钮uiButtonLogin执行相同操作
  5. 确保Panel3Panel6的初始状态设置为隐藏

功能说明

实现后的功能如下:

  1. 注册流程

    • 用户输入用户名和密码
    • 点击注册按钮
    • 系统验证输入:
      • 若输入为空,显示Panel6(错误提示)3 秒
      • 若用户名已存在,显示Panel6(错误提示)3 秒
      • 若注册成功,显示Panel3(成功提示)2 秒,然后跳转到welcomeUI页面
  2. 登录流程

    • 用户输入用户名和密码
    • 点击登录按钮
    • 系统验证凭据:
      • 若验证成功,显示Panel3(成功提示)2 秒,然后跳转到welcomeUI页面
      • 若验证失败,显示Panel6(错误提示)3 秒
  3. 所有流程结束后都会清空输入框

测试步骤

  1. 编译并运行项目
  2. 测试注册功能:
    • 不输入任何内容点击注册 → 应显示错误面板
    • 输入已存在的用户名 → 应显示错误面板
    • 输入新用户名和密码 → 应显示成功面板,然后跳转
  3. 测试登录功能:
    • 使用刚注册的账号登录 → 应成功跳转
    • 使用错误的账号或密码 → 应显示错误面板

这个方案应该能解决你遇到的按钮同时执行多个动作的问题,并提供完整的注册登录功能。如果还有任何问题,请告诉我具体的错误现象或行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915826.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OkHttp 与 Chuck 结合使用:优雅的 Android 网络请求调试方案

前言在 Android 应用开发过程中&#xff0c;网络请求调试是日常工作中不可或缺的一部分。Chuck 是一个轻量级的 OkHttp 拦截器&#xff0c;能够在应用内直接显示网络请求和响应的详细信息&#xff0c;无需连接电脑或使用额外工具。本文将详细介绍如何将 OkHttp 与 Chuck 结合使…

AI学习--本地部署ollama

AI小白&#xff0c;记录下本地部署ollama1.下载安装ollama下载地址ollama官方地址https://ollama.com/download根据系统下载即可下面是我下载的地址 https://release-assets.githubusercontent.com/github-production-release-asset/658928958/e8384a9d-8b1e-4742-9400-7a0ce2a…

docker 设置镜像仓库代理

1. 创建 Docker 服务的代理配置文件sudo mkdir -p /etc/systemd/system/docker.service.d2.创建文件 /etc/systemd/system/docker.service.d/http-proxy.conf&#xff0c;内容如下&#xff1a;[Service] Environment"HTTP_PROXYhttp://192.168.0.111:7890" Environme…

ffmpeg rtsp 丢包处理

直接用 demux 在有些网络中&#xff0c;丢包画屏&#xff1b; 再ffmpeg和ffplay中&#xff0c;可以指定 tcp 方式&#xff0c;所以代码直接设置陶瓷坯方式&#xff1b; // 设置RTSP选项优化接收数据流防止数据包丢失 av_dict_set(&options, "rtsp_transport", …

aosp15实现SurfaceFlinger的dump输出带上Layer详细信息踩坑笔记

背景&#xff1a; 针对上一篇文章 aosp15上SurfaceFlinger的dump部分新特性-无Layer信息输出如何解决&#xff1f; 给大家布置了一个小作业&#xff0c;那就是需要实现dumpsys SurfaceFlinger相关输出中可以携带上所有的Layer的详细信息需求&#xff0c;今天来带大家详细实现一…

Linux 网络调优指南:废弃的 tcp_tw_recycle 与安全替代方案

一、问题起源:消失的内核参数 当你在 Debian 10 系统执行 sysctl 命令时,若看到报错: sysctl: cannot stat /proc/sys/net/ipv4/tcp_tw_recycle: 没有那个文件或目录 这并非配置错误,而是Linux 内核演进的结果。自 4.12 版本起,内核正式移除了 tcp_tw_recycle 参数——…

删除有序数组中的重复项

class Solution {public int removeElement(int[] nums, int val) {// 暴力法int n nums.length;for (int i 0; i < n; i) {if (nums[i] val) {for (int j i 1; j < n; j) {nums[j - 1] nums[j];}i--;n--;}}return n;} }代码逻辑解析首先获取数组长度n&#xff0c;…

【Pytest】从配置到固件的使用指南

掌握高效测试的关键技巧&#xff0c;打造专业级自动化测试框架一、Pytest框架的核心优势 Pytest作为Python最强大的测试框架之一&#xff0c;以其简洁灵活的语法和丰富的扩展能力深受开发者喜爱。相比unittest&#xff0c;Pytest提供了更直观的测试编写方式和更强大的功能集&am…

[matlab]matlab上安装xgboost安装教程简单版

【前言】 网上基于MATLAB的xgboost安装教程太少了&#xff0c;以至于几乎搜不到&#xff0c;为此做了一个简单安装教程【安装前提】 有matlab软件&#xff0c;版本越高越好&#xff0c;我用的是2023a。理论支持matlab2018a及其以上&#xff0c;因此需要自己提前安装好matlab【安…

基于多种机器学习的成都市二手房房价分析与价格预测【城市可换、算法模型多种对比】

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目背景数据来源与采集方式数据预处理与清洗流程探索性数据分析&#xff08;EDA&#xff09;模型构建与预测方法项目意义与应用前景相关可视化展示总结每文一语有需要本项目的代码或文档以及…

PostgreSQL 事务ID环绕问题

事务ID&#xff08;XID&#xff09;基本概念 从Transactions and Identifiers可知&#xff1a; 事务 ID&#xff0c;例如 278394&#xff0c;会根据 PostgreSQL 集群内所有数据库使用的全局计数器按顺序分配给事务。此分配会在事务首次写入数据库时进行。这意味着编号较低的 x…

高等数学-矩阵知识

好的&#xff0c;我们来详细讲解高等数学&#xff08;主要是线性代数部分&#xff09;中的核心矩阵知识。矩阵是线性代数的基石&#xff0c;广泛应用于数学、物理、工程、计算机科学、经济学等众多领域。 一、矩阵的基本概念定义&#xff1a; 一个 m n 矩阵 (Matrix) 是一个由…

React 项目性能优化概要

应用级性能优化&#xff0c;需要结合实际需求展开分析&#xff0c;通常我们需要从以下几个方面来考虑&#xff1a; 1. 识别性能瓶颈 识别性能瓶颈是优化的第一步&#xff0c;通过各种工具和方法找到影响性能的主要原因&#xff1a; React Profiler&#xff1a;使用 React Dev…

【web自动化】-5- fixture集中管理和项目重构

一、投标用例设计 # 定义让前台页面保持自动登录的fixture pytest.fixture() def user_driver():driver webdriver.Chrome()driver.get("http://47.107.116.139/fangwei/")driver.maximize_window()# 创建页面类对象page ReceptionLoginPage(driver)# 通过页面类对…

Dify工作流:爬虫文章到AI知识库

部署Dify 代码拉取 git clone https://github.com/langgenius/dify.git cd dify/docker启动容器 docker-compose up -d启动成功准备知识库 创建知识库 创建一个空的知识库要先从网址中&#xff0c;找到这个知识库的id&#xff0c;记下后面需要用到。新建API密钥 创建密钥&#…

支付鉴权方案介绍

前后端交互中的鉴权是确保请求来源合法、身份可信、权限合适的关键手段。不同系统架构和业务类型下,使用的鉴权方式略有不同,但主要可分为以下几类: ✅ 一、前后端交互常见的鉴权方式概览 鉴权方式 优点 缺点 适用场景 Cookie + Session 简单、成熟,服务端易控制 不适合跨域…

halcon处理灰度能量图

使用halcon处理射线图像&#xff0c;对高能区域和低能区域分割处理感兴趣区域&#xff0c;筛选区域下的灰度值区间范围。图像灰度值为16位深度图。* 读取灰度图像 read_image (Image, /123.tif)** 获取图像尺寸 get_image_size (Image, Width, Height)* 分割图像为左右两部分&a…

Oracle From查看弹性域设置

打开弹性与设置&#xff1a;【应用开发员->弹性域->说明性->段】打开后界面如下&#xff1a; 把光标定位到标题&#xff0c;然后点击“手电筒”搜索名称&#xff08;名称就是你要查询的那个弹性域的名称&#xff09;我这里就是搜索“附加题头信息”&#xff0…

git初始流程

对于一个新项目&#xff0c;从 Git 仓库拉取 test_tool 分支并进行后续修改提交的完整流程如下&#xff1a; 一、首次拉取项目&#xff08;克隆仓库并切换分支&#xff09;克隆远程仓库到本地 打开终端&#xff08;或 PyCharm 的 Terminal&#xff09;&#xff0c;进入你想存放…

emuelec模拟器 ,s905盒子树莓派街机游戏

EmuELEC支持的盒子类型相当广泛&#xff0c;主要包括使用以下芯片方案的机顶盒等设备&#xff1a; S905系列及其变体&#xff1a;如S905、S905D、S905L、S905M、S905X、S905X2、S905X3、S905X4、S905W、S905Y等。 S912&#xff1a;这也是EmuELEC支持的一个常见芯片方案。 S922x…