完整的 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
英文地址,請注明出處:http://en.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…