【Android学习】简单的登录页面和业务逻辑实现

news2024/12/25 13:27:39

实现功能

1 登录页:密码登录和验证码登录
2 忘记密码页:修改密码
3 页面基础逻辑 java代码

基础页面

在这里插入图片描述
在这里插入图片描述

XML

login_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
<!--    单选框-->
    <RadioGroup
        android:id="@+id/rg_login"
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_layout_height"
        android:orientation="horizontal">
        <RadioButton
            android:id="@+id/rg_password"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="@string/login_by_password"
            android:textSize="@dimen/common_font_size"
            android:checked="true"/>
        <RadioButton
            android:id="@+id/rg_vertifycode"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="@string/login_by_vertifycode"
            android:textSize="@dimen/common_font_size"/>
    </RadioGroup>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_layout_height"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/tv_phone"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="@string/phone_number"
            android:textColor="@color/black"
            android:textSize="@dimen/common_font_size"/>
        <EditText
            android:id="@+id/et_phone"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:layout_marginTop="5dp"
            android:layout_marginBottom="5dp"
            android:hint="@string/inout_phone_number"
            android:background="@drawable/editor_selector"
            android:textColor="@color/black"
            android:maxLength="11"
            android:inputType="number"
            android:textColorHint="@color/grey"
            android:textSize="@dimen/common_font_size"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/item_layout_height"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/tv_password"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="@string/login_password"
            android:textColor="@color/black"
            android:textSize="@dimen/common_font_size"/>
        <RelativeLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">
            <EditText
                android:id="@+id/et_password"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:layout_marginTop="5dp"
                android:layout_marginBottom="5dp"
                android:inputType="numberPassword"
                android:hint="@string/input_password"
                android:background="@drawable/editor_selector"
                android:textColor="@color/black"
                android:maxLength="6"
                android:textColorHint="@color/grey"
                android:textSize="@dimen/common_font_size"/>
            <Button
                android:id="@+id/btn_forget"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:text="@string/forget_password"
                android:layout_alignParentEnd="true"
                android:textColorHint="@color/black"
                android:textSize="@dimen/common_font_size"
                />
        </RelativeLayout>
    </LinearLayout>
    <CheckBox
        android:id="@+id/ck_remember"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/remember_password"
        android:textColorHint="@color/black"
        android:textSize="@dimen/common_font_size"
        />
    <Button
        android:id="@+id/btn_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/login"
        android:textColorHint="@color/black"
        android:textSize="@dimen/btn_font_size"
        />
</LinearLayout>
login_forget_password.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="60dp"
      android:orientation="horizontal">
    <TextView

        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="@string/input_new_password"
        android:textColor="@color/black"
        android:textSize="@dimen/common_font_size"/>
    <EditText
        android:id="@+id/et_password_first"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:inputType="numberPassword"
        android:hint="@string/input_new_password_hint"
        android:background="@drawable/editor_selector"
        android:textColor="@color/black"
        android:maxLength="11"
        android:textColorHint="@color/grey"
        android:textSize="@dimen/common_font_size"/>
  </LinearLayout>
  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="60dp"
      android:orientation="horizontal">
    <TextView

        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="@string/confirm_new_password"
        android:textColor="@color/black"
        android:textSize="@dimen/common_font_size"/>
    <EditText
        android:id="@+id/et_password_second"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:hint="@string/confirm_new_password_again"
        android:background="@drawable/editor_selector"
        android:textColor="@color/black"
        android:maxLength="11"
        android:inputType="number"
        android:textColorHint="@color/grey"
        android:textSize="@dimen/common_font_size"/>
  </LinearLayout>
  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="60dp"
      android:orientation="horizontal">
    <TextView

        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="@string/verifycode"
        android:textColor="@color/black"
        android:textSize="@dimen/common_font_size"/>
    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1">
      <EditText
          android:id="@+id/et_verifycode"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_weight="1"
          android:layout_marginTop="5dp"
          android:layout_marginBottom="5dp"
          android:inputType="numberPassword"
          android:hint="@string/input_verifycode"
          android:background="@drawable/editor_selector"
          android:textColor="@color/black"
          android:maxLength="6"
          android:textColorHint="@color/grey"
          android:textSize="@dimen/common_font_size"/>
      <Button
          android:id="@+id/btn_verificode"
          android:layout_width="wrap_content"
          android:layout_height="match_parent"
          android:text="@string/get_verifycode"
          android:layout_alignParentEnd="true"
          android:textColorHint="@color/black"
          android:textSize="@dimen/common_font_size"
          />
    </RelativeLayout>
  </LinearLayout>
  <Button
      android:id="@+id/btn_confirm"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="@string/done"
      android:textColorHint="@color/black"
      android:textSize="@dimen/btn_font_size"
      />
</LinearLayout>

Java

loginMain.java
package com.example.learn;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.BlendMode;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import com.example.learn.utils.ViewUtil;

import java.util.Random;

public class LoginMainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener, View.OnClickListener {
    private EditText et_phone;
    private TextView tv_password;
    private EditText et_password;
    private Button btn_forget;
    private CheckBox ck_remember;
    private RadioButton rg_password;
    private RadioButton rg_vertifycode;
    private ActivityResultLauncher<Intent> register;
    private Button btn_login;
    //定义固定密码 调试使用
    private String mPassword = "111111";
    private String verifyCode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_main);
        RadioGroup rg_login = findViewById(R.id.rg_login);
        et_phone = findViewById(R.id.et_phone);
        tv_password = findViewById(R.id.tv_password);
        et_password = findViewById(R.id.et_password);
        btn_forget = findViewById(R.id.btn_forget);
        ck_remember = findViewById(R.id.ck_remember);
        rg_password = findViewById(R.id.rg_password);
        rg_vertifycode = findViewById(R.id.rg_vertifycode);
        btn_login = findViewById(R.id.btn_login);
        //设置监听器
        rg_login.setOnCheckedChangeListener(this);
        //为电话号码、密码增加文本长度变换监听器
        et_phone.addTextChangedListener(new HideKeyboardWatch(et_phone, 11));
        et_password.addTextChangedListener(new HideKeyboardWatch(et_password, 6));
        //为忘记密码/获取验证码增加点击事件
        btn_forget.setOnClickListener(this);
       //login按钮
        btn_login.setOnClickListener(this);
        //全局registerActivityForResult
        register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
                new ActivityResultCallback<ActivityResult>() {
                    //接收返回值
                    @Override
                    public void onActivityResult(ActivityResult result) {
                        Intent intent = result.getData();
                        if(intent!=null && result.getResultCode()==Activity.RESULT_OK){
                            mPassword = intent.getStringExtra("new_password");
                        }
                    }
                });

    }

    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
        switch (checkedId) {
            case R.id.rg_password:
                //密码登录
                //验证码登录
                tv_password.setText(getString(R.string.login_password));
                et_password.setHint(getString(R.string.input_password));
                btn_forget.setText(getString(R.string.forget_password));
                ck_remember.setVisibility(View.VISIBLE);//显示
                break;
            case R.id.rg_vertifycode:
                //验证码登录
                tv_password.setText(getString(R.string.verifycode));
                et_password.setHint(getString(R.string.input_verifycode));
                btn_forget.setText(getString(R.string.get_verifycode));
                ck_remember.setVisibility(View.GONE);//隐藏
                break;


        }
    }

    @Override
    public void onClick(View view) {
        String phone = et_phone.getText().toString();
        if (phone.length() < 11) {
            Toast.makeText(this, "手机号码不足11位", Toast.LENGTH_SHORT).show();
            return;
        }
        switch (view.getId()) {
            case R.id.btn_forget:
                //说明选择是密码登录
                // 此时按钮为忘记密码
                if (rg_password.isChecked()) {
                    //此时可将手机号传递给下一个忘记密码页面
                    Intent intent = new Intent(this, LoginForgetActivity.class);
                    intent.putExtra("phone", phone);
                    register.launch(intent);
                }else if(rg_vertifycode.isChecked()){
                    //生成6位随机验证码
                    verifyCode = String.format("%6d",new Random().nextInt(999999));
                    //弹出对话框 便于用户记住验证码
                    AlertDialog.Builder adb = new AlertDialog.Builder(this);
                    adb.setTitle("请记住验证码");
                    adb.setMessage("手机号"+phone+",验证码为"+verifyCode+",请输入验证码!");
                    adb.setPositiveButton("好的",null);
                    AlertDialog ad =adb.create();
                    ad.show();
                }
                break;
            case R.id.btn_login:
                //如果密码方式登录 判断密码是否正确
                if(rg_password.isChecked()){
                    if(!mPassword.equals(et_password.getText().toString())){
                        Toast.makeText(this,"请输入正确密码",Toast.LENGTH_SHORT).show();
                        return;
                    }
                    loginSuccess();
                }else if(rg_vertifycode.isChecked()){
                    if(!verifyCode.equals(et_password.getText().toString())){
                        Toast.makeText(this,"请输入正确验证码",Toast.LENGTH_SHORT).show();
                        return;
                    }
                    loginSuccess();
                }
                break;

        }
    }

    private void loginSuccess() {
        String desc=String.format("您的手机号码为%s,恭喜您登陆成功!",et_phone.getText().toString());
        AlertDialog.Builder adb = new AlertDialog.Builder(this);
        adb.setTitle("恭喜您登陆成功!");
        adb.setMessage("您的手机号为"+et_phone.getText().toString());
        adb.setNegativeButton("确定返回", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                //结束当前活动页面
                finish();
            }
        });
        adb.setPositiveButton("我再看看",null);
        AlertDialog ad = adb.create();
        ad.show();

    }

    //编辑框监听器,当输入文本长度达到最大长度,隐藏键盘。
    private class HideKeyboardWatch implements TextWatcher {
        private EditText mView;
        private int maxLen;

        public HideKeyboardWatch(EditText et, int len) {
            this.mView = et;
            this.maxLen = len;
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            if (s.toString().length() == maxLen) {
                //隐藏软键盘
                ViewUtil.hideKeyboard(LoginMainActivity.this, mView);
            }
        }
    }
}
login_forget_password.java
package com.example.learn;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.util.Random;

public class LoginForgetActivity extends AppCompatActivity implements View.OnClickListener {

    private String mPhone;
    private String verifyCode;
    private EditText et_password_first;
    private EditText et_password_second;
    private EditText et_verifycode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_forget);
        mPhone = getIntent().getStringExtra("phone");
        findViewById(R.id.btn_verificode).setOnClickListener(this);
        findViewById(R.id.btn_confirm).setOnClickListener(this); 
        et_password_first = findViewById(R.id.et_password_first);
        et_password_second = findViewById(R.id.et_password_second);
        et_verifycode = findViewById(R.id.et_verifycode);
    }


    @Override
    public void onClick(View view) {
        switch(view.getId()){
            case R.id.btn_verificode:
                //生成6位随机验证码
                verifyCode = String.format("%6d",new Random().nextInt(999999));
                //弹出对话框 便于用户记住验证码
                AlertDialog.Builder adb = new AlertDialog.Builder(this);
                adb.setTitle("请记住验证码");
                adb.setMessage("手机号"+mPhone+",验证码为"+verifyCode+",请输入验证码!");
                adb.setPositiveButton("好的",null);
                AlertDialog ad =adb.create();
                ad.show();
                break;
            case R.id.btn_confirm:
                String pf = et_password_first.getText().toString();
                String ps = et_password_second.getText().toString();
                if(pf.length()<6){
                    Toast.makeText(this,"请输入正确密码",Toast.LENGTH_SHORT).show();
                    return;
                }
                if(!pf.equals(ps)){
                    Toast.makeText(this,"两次密码不同",Toast.LENGTH_SHORT).show();
                    return;
                }
                if(!verifyCode.equals(et_verifycode.getText().toString())){
                    Toast.makeText(this,"验证码不正确",Toast.LENGTH_SHORT).show();
                    return;
                }
                Toast.makeText(this,"密码修改成功",Toast.LENGTH_SHORT).show();
                Intent intent = new Intent();
                intent.putExtra("new_password",pf);
                setResult(Activity.RESULT_OK,intent);
                finish();//结束当前页面


                break;
        }
    }
}

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

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

相关文章

C++静态数组和C语言静态数组的区别( array,int a[])

目录 一、区别 1、越界读&#xff0c;检查不出来 2、越界写&#xff0c;抽查&#xff0c;可能检查不出来&#xff0c;有局限性 二、array缺点 一、区别 C语言的静态数组int a[]; 静态数组的越界检查不稳定的&#xff1a; 1、越界读&#xff0c;检查不出来 2、越界写&#x…

开发一款简易APP

希望打开APP后,显示当前时间..可能不实用,重在体验 安装Flutter 如果在arm架构的 Mac 电脑上进行开发&#xff0c;需要安装 Rosetta 2, 因为一些辅助工具需要&#xff0c;可通过手动运行下面的命令来安装&#xff1a; sudo softwareupdate --install-rosetta --agree-to-licens…

一篇文章带你深入了解“指针”

一篇文章带你深入了解“指针” 内存和地址了解指针指针类型const修饰指针指针的运算指针与整数之间的运算指针与指针之间的运算指针的关系运算 void* 指针传值调用和传址调用数组和指针的关系野指针野指针的形成原因规避野指针 二级指针字符指针指针数组数组指针数组传参一维数…

动态炫酷的新年烟花网页代码

烟花效果的实现可以采用前端技术&#xff0c;如HTML、CSS和JavaScript。通过结合动画、粒子效果等技术手段&#xff0c;可以创建出独特而炫目的烟花效果。同时&#xff0c;考虑到性能和兼容性&#xff0c;需要确保效果在各种设备上都能够良好运行。 效果显示http://www.bokequ.…

Transformer中的数据输入构造

文章目录 1. 文本内容2. 字典构造2.1 定义一个类用于字典构造2.2 拆分文本2.3 构造结果 3. 完整代码 1. 文本内容 假如我们有如下一段文本内容&#xff1a; Optics It is the branch of physics that studies the behaviour and properties of light . Optical Science 这段…

代码随想录Day 37|Leetcode|Python|● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结…

Java web第五次作业

1.在idea中配置好数据源 2、视频案例中只给出了查询所有结果的示例&#xff0c;请自己完成添加、删除、修改操作的代码。以下供参 考。 Delete("delete from emp where id#{id}") public void delete(Integer id); 测试代码 Test public void testDelete(){ empMa…

AI产品经理需要懂的技术全景图

AI产品经理需要懂技术&#xff0c;以便与算法工程师同频沟通&#xff0c;以及合理管控AI项目进度。 项目掌握内容掌握边界数学统计学基础概念常见概念知道、了解模型构建 模型构建流程涉及角色每个角色工作内容清楚知道每个角色该做什么&#xff0c;需要花费多少成本&#xff…

使用python开发的词云图生成器2.0

使用python开发的词云图生成器2.0 更新部分词云图主要三方库工具介绍和效果工具界面&#xff1a; 代码 更新部分 1.支持选择字体&#xff1b; 2.支持选择词云图形状 词云图 词云图啊&#xff0c;简单来说&#xff0c;它可以把文本数据中的高频关键词变成不同大小、颜色的词汇…

「C/C++ 01」scanf()与回车滞留问题

目录 〇、scanf()接收用户输入的流程 一、回车的缓冲区滞留问题是什么&#xff1f; 二、为什么&#xff1f; 三、四个解决方法&#xff1a; 1. 在前面的scanf()中加上\n 2. 在scanf("%c")中添加空格 3. 使用getchar()来吸收回车 4. 使用fflush()清空缓冲区 〇、scan…

seata容器部署nacos注册配置中心、db存储实践记录

seata容器部署nacos注册&配置中心、db存储实践记录 说明seata容器初步部署(可跳过)seata初部署获取配置文件springboot简单集成seata测试 seata使用nacos注册中心、db存储环境准备准备nacos配置中心配置准备Mysql数据库 seata配置nacos注册中心准备docker-compose.yaml文件…

stm32单片机开发四、USART“串口通信“

串口的空闲状态时高电平&#xff0c;起始位是低电平&#xff0c;来打破空闲状态的高电平 必须要有停止位&#xff0c;停止位一般为一位高电平 串口常说的数据为8N1&#xff0c;其实就是8个数据位&#xff08;固定的&#xff09;&#xff0c;N就是none&#xff0c;也就是0个校验…

mfc140.dll丢失如何修复?分享各种mfc140.dll丢失的解决方法

在Windows操作系统的世界里&#xff0c;动态链接库&#xff08;Dynamic Link Library, DLL&#xff09;扮演着举足轻重的角色&#xff0c;它们是实现程序功能共享、减少内存占用、促进模块化编程的关键组件。MFC140.dll便是众多DLL文件中的一员&#xff0c;它与微软基础类库&am…

【kettle006】kettle访问华为openGauss高斯数据库并处理数据至execl文件(已更新)

1.一直以来想写下基于kettle的系列文章&#xff0c;作为较火的数据ETL工具&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下华为openGauss高斯数据库相关知识体系 3.欢迎批评指正&#xff0c;跪谢…

网络基础「HTTPS」

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 腾讯云远程服务器 文章目录 1.基本概念1.1.HTTP协议面临的问题1.2.加密与解密1.3.数字摘要1.4.数字签名 2.解决方案2.1.「对称式加密」2.2.「非对…

变分自编码器(VAE)介绍

变分自编码器&#xff08;VAE&#xff09;介绍 一、前言二、变分自编码器1、VAE的目标2、理论推导3、补充4、重参数技巧 一、前言 变分自编码器&#xff08;Variational Auto-Encoder&#xff0c;VAE&#xff09;是以自编码器结构为基础的深度生成模型。 自编码器&#xff08…

基于SpringBoot+Vue点餐系统设计和实现(源码+LW+部署讲解)

&#x1f339;作者简介&#xff1a;✌全网粉丝10W&#xff0c;前大厂员工&#xff0c;多篇互联网电商推荐系统专利&#xff0c;现有多家创业公司&#xff0c;致力于建站、运营、SEO、网赚等赛道。也是csdn特邀作者、博客专家、Java领域优质创作者&#xff0c;博客之星、掘金/华…

力扣每日一题104:二叉树的最大深度

题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,null,2…

QT5之windowswidget_菜单栏+工具栏_核心控件_浮动窗口_模态对话框_标准对话框/文本对话框

菜单栏工具栏 新建工程基类是QMainWindow 1、 2、 3、 点.pro文件&#xff0c;添加配置 因为之后用到lambda&#xff1b; 在.pro文件添加配置c11 CONFIG c11 #不能加分号 添加头文件 #include <QMenuBar>//菜单栏的头文件 主窗口代码mainwindow.cpp文件 #include &q…

了解并学会使用反射

目录 一、反射的应用场景&#xff08;简单了解&#xff09; 二、反射的定义 三、关于反射的四个重要的类 四、反射的使用 1.Class获取一个class对象的方式 方式一&#xff1a;forName&#xff08;&#xff09;&#xff1a; 方式二&#xff1a;封装类.Class&#xff1a; …