Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【QT】QT事件处理

【QT】QT事件处理

作者头像
半生瓜的blog
发布于 2023-05-13 05:55:34
发布于 2023-05-13 05:55:34
1.6K00
代码可运行
举报
文章被收录于专栏:半生瓜のblog半生瓜のblog
运行总次数:0
代码可运行

事件处理

QT中,事件作为一个对象,继承自QEvent类,常见的有键盘事件QKeyEvent、鼠标事件QMouseEvent和定时器事件QTimerEvent等。QT中,任何QObject子类示例都可以接收和处理事件。实际编程中通常实现部件的paintEvent()、mousePressEvent()等事件处理函数来处理特定部件的特定事件。

每个程序的main函数最后都会调用QApplication类的exec()函数,它会使QT应用程序进入到事件循环,使应用程序在运行的时候接收各种事件。一旦有事件发生,QT便会构造一个相应的QEvent子类的对象来表示它,然后将它传递给QObject对象或子对象。


鼠标事件

对鼠标实现进行重写来实现你想要达到的功能

mouseevent.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef MOUSEEVENT_H
#define MOUSEEVENT_H

#include <QMainWindow>
#include<QLabel>
#include<QMouseEvent>
namespace Ui {
class MouseEvent;
}

class MouseEvent : public QMainWindow
{
    Q_OBJECT

public:
    explicit MouseEvent(QWidget *parent = 0);
    ~MouseEvent();
protected:
    void mousePressEvent(QMouseEvent *event);//鼠标按下
    void mouseMoveEvent(QMouseEvent *event);//鼠标移动
    void mouseReleaseEvent(QMouseEvent *event);//鼠标释放
private:
    Ui::MouseEvent *ui;
    QLabel *m_statusLabel;
    QLabel* m_posLabel;
};

#endif // MOUSEEVENT_H

mouseevent.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "mouseevent.h"
#include "ui_mouseevent.h"

MouseEvent::MouseEvent(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MouseEvent)
{
    ui->setupUi(this);
    setWindowTitle(QString("鼠标事件"));
    m_statusLabel = new QLabel(QString("当前位置:"));
    m_statusLabel->setFixedWidth(100);

    m_posLabel = new QLabel(QString(""));
    m_posLabel->setFixedWidth(100);

    statusBar()->addPermanentWidget(m_statusLabel);//状态栏添加永久部件
    statusBar()->addPermanentWidget(m_posLabel);
}

MouseEvent::~MouseEvent()
{
    delete ui;
}

void MouseEvent::mousePressEvent(QMouseEvent *event)
{
    QString str = "("+QString::number(event->x())+","+QString::number(event->y())+")";
    if(event->button() == Qt::LeftButton)
    {
        statusBar()->showMessage(QString("左键:") +str );
    }
    else if(event->button() == Qt::MidButton)
    {
        statusBar()->showMessage(QString("中键:")+str);
    }
    else if(event->button() == Qt::RightButton)
    {
        statusBar()->showMessage(QString("右键")+str);
    }
}

void MouseEvent::mouseMoveEvent(QMouseEvent *event)
{
    QString strPos;
    strPos = "(" + QString::number(event->x())+","+QString::number(event->y())+")";
    m_posLabel->setText(strPos);
}

void MouseEvent::mouseReleaseEvent(QMouseEvent *event)
{
    QString strPos;
    strPos = "(" + QString::number(event->x())+","+QString::number(event->y())+")";
    statusBar()->showMessage(QString("释放在:")+strPos,3000);
}

键盘事件

通过重写键盘事件来达到你想要实现的效果

keyevent.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef KEYEVENT_H
#define KEYEVENT_H

#include <QWidget>
#include<QKeyEvent>
namespace Ui {
class KeyEvent;
}

class KeyEvent : public QWidget
{
    Q_OBJECT

public:
    explicit KeyEvent(QWidget *parent = 0);
    ~KeyEvent();
    void drawPix();
    void keyPressEvent(QKeyEvent *event) override;
    void paintEvent(QPaintEvent* event)override;

private:
    Ui::KeyEvent *ui;
    QPixmap *m_pix;
    QImage m_image;
    int m_startX;      //图标顶点位置
    int m_startY;
    int m_width;       //界面的宽度,高度
    int m_height;
    int m_step;         //步长

};

#endif // KEYEVENT_H

keyevent.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "keyevent.h"
#include "ui_keyevent.h"
#include<QPainter>
#include<QPen>
KeyEvent::KeyEvent(QWidget *parent) :
   QWidget(parent),
   ui(new Ui::KeyEvent)
{
   ui->setupUi(this);
   setWindowTitle(QString("键盘事件"));
   setAutoFillBackground(true);
   setFixedSize(521,256);
   m_width = size().width();
   m_height = size().height();
   m_pix = new QPixmap(m_width,m_height);
   m_pix->fill(Qt::white);
   m_image.load("picture.jpg");
   m_startX = 100;
   m_startY = 100;
   m_step = 20;
   drawPix();

}

KeyEvent::~KeyEvent()
{
   delete ui;
}

void KeyEvent::drawPix()
{
   m_pix->fill(Qt::white);
   QPainter painter(this);
   QPen pen(Qt::DotLine);
   //按照步长画纵向网格线
   //bagin与end成对出现
   for(int i = m_step;i < m_width; i+=m_step)
   {
       painter.begin(m_pix);//指定m_pix为绘图设备
       painter.setPen(pen);//设置笔
       painter.drawLine(QPoint(i,0),QPoint(i,height()));
       painter.end();
   }
   //按照步长画水平网格线
   for(int j = m_step;j < m_height;j += m_step)
   {
       painter.begin(m_pix);//指定m_pix为绘图设备
       painter.setPen(pen);//设置笔
       painter.drawLine(QPoint(0,j),QPoint(m_width,j));
       painter.end();
   }
   //画图片
   painter.begin(m_pix);
   painter.drawImage(QPoint(m_startX,m_startY),m_image);
   painter.end();
}

void KeyEvent::keyPressEvent(QKeyEvent *event)
{
   //按下ctrl,每次移动为1个像素
   if(event->modifiers() == Qt::ControlModifier)
   {
        if(event->key() == Qt::Key_Left)
        {
            m_startX = (m_startX -1)<0 ? m_startX : m_startX-1;
        }
        if(event->key() == Qt::Key_Right)
        {
            m_startX = (m_startX +1+m_image.width()) > m_width ? m_startX :m_startX+1 ;
        }
        if(event->key() == Qt::Key_Up)
        {
           m_startY = (m_startY - 1) < 0 ? m_startY:m_startY -1;
        }
        if(event->key() == Qt::Key_Down)
        {
           m_startY = (m_startY +1 +m_image.height()) > m_height ? m_startY:m_startY+1;
        }
   }
   else//没有按ctrl键,每一移动为一个步长
   {
       //调整图标左上角位置到网格顶点顶点上
       m_startX = m_startX - m_startX % m_step;
       m_startY  =m_startY - m_startY % m_step;
       if(event->key() == Qt::Key_Left)
       {
           m_startX = (m_startX -m_step)<0 ? m_startX : m_startX-m_step;
       }
       if(event->key() == Qt::Key_Right)
       {
           m_startX = (m_startX +m_step+m_image.width()) > m_width ? m_startX :m_startX+m_step ;
       }
       if(event->key() == Qt::Key_Up)
       {
          m_startY = (m_startY - m_step) < 0 ? m_startY:m_startY -m_step;
       }
       if(event->key() == Qt::Key_Down)
       {
          m_startY = (m_startY +m_step +m_image.height()) > m_height ? m_startY:m_startY+m_step;
       }
   }
   drawPix();//根据调整后的图标位置重新在m_pix上绘制图像
   update();//触发窗口重绘
}

void KeyEvent::paintEvent(QPaintEvent *event)
{
   QPainter painter;
   painter.begin(this);
   painter.drawPixmap(QPoint(0,0),*m_pix);
   painter.end();
}

事件过滤

指定某个对象对什么事件进行处理。

**示例:**鼠标按压对指定图片进行缩放

dialog.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include<QLabel>
#include<QImage>
#include<QHBoxLayout>
#include<QEvent>
#include<QMouseEvent>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0,Qt::WindowFlags f = 0);
    ~Dialog();
public slots:
    bool eventFilter(QObject*watched ,QEvent *event)override;
private:
    QLabel *m_label1;
    QLabel *m_label2;
    QLabel *m_label3;
    QLabel *m_stateLabel;

    QImage m_image1;
    QImage m_image2;
    QImage m_image3;


};

#endif // DIALOG_H

dialog.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "dialog.h"
#include<QHBoxLayout>

Dialog::Dialog(QWidget *parent,Qt::WindowFlags f)
    : QDialog(parent,f)
{
    setWindowTitle(QString("事件过滤"));

    m_label1 = new QLabel;
    m_label2 =new QLabel;
    m_label3 = new QLabel;
    m_stateLabel = new QLabel(QString("鼠标按下标志"));



    m_stateLabel->setAlignment(Qt::AlignHCenter);//水平居中

    m_image1.load("fly1.png");
    m_image2.load("fly2.png");
    m_image3.load("fly3.png");

    m_label1->setPixmap(QPixmap::fromImage(m_image1));
    m_label2->setPixmap(QPixmap::fromImage(m_image2));
    m_label3->setPixmap(QPixmap::fromImage(m_image3));
    //添加水平布局
    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(m_label1);
    layout->addWidget(m_label2);
    layout->addWidget(m_label3);


    QVBoxLayout*mainLayout = new QVBoxLayout(this);
    mainLayout->addLayout(layout);
    mainLayout->addWidget(m_stateLabel);

    resize(m_image2.width() * 3,m_image2.height() *2);

    //给图片标签部件安装事件过滤,并且指定整个窗体为监视事件的对象。
    m_label1->installEventFilter(this);
    m_label2->installEventFilter(this);
    m_label3->installEventFilter(this);


}

Dialog::~Dialog()
{

}

//对象-事件
bool Dialog::eventFilter(QObject *watched, QEvent *event)
{
    QMatrix matrix;//放大比例
    QImage tmpImg;//保存处理过后的图片

    //放大图片
    matrix.scale(2.0,2.0);
    //对象
    if(watched == m_label1)
    {
        //鼠标按下事件的处理
        if(event->type() == QEvent::MouseButtonPress)
        {
            //转换事件类型Wie鼠标事件
            QMouseEvent* mouseEvent = (QMouseEvent*)event;
            if(mouseEvent->button() & Qt::LeftButton)
            {
                m_stateLabel->setText(QString("左键按下图片1"));
            }
            if(mouseEvent->button() & Qt::MidButton)
            {
                m_stateLabel->setText(QString("中键按下图片1"));
            }
            if(mouseEvent->button() & Qt::RightButton)
            {
                m_stateLabel->setText(QString("右键按下图片1"));
            }
            //将原本图片缩放用tmpImg临时存储,设置图片
            tmpImg = m_image1.transformed(matrix);
            m_label1->setPixmap(QPixmap::fromImage(tmpImg));
        }
        //鼠标释放,恢复图片大小
        if(event->type() == QEvent::MouseButtonRelease)
        {
            m_stateLabel->setText(QString("鼠标释放图片1"));
            m_label1->setPixmap(QPixmap::fromImage(m_image1));
        }
    }
  else if(watched ==m_label2)
  {
        if(event->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent* mouseEvent = (QMouseEvent*)event;
            if(mouseEvent->button() & Qt::LeftButton)
            {
                m_stateLabel->setText(QString("左键按下图片2"));
            }
            if(mouseEvent->button() & Qt::MidButton)
            {
                m_stateLabel->setText(QString("中键按下图片2"));
            }
            if(mouseEvent->button() & Qt::RightButton)
            {
                m_stateLabel->setText(QString("右键按下图片2"));
            }
            tmpImg = m_image2.transformed(matrix);
            m_label2->setPixmap(QPixmap::fromImage(tmpImg));
        }
        if(event->type() == QEvent::MouseButtonRelease)
        {
            m_stateLabel->setText(QString("鼠标释放图片2"));
            m_label2->setPixmap(QPixmap::fromImage(m_image2));
        }
  }
  else if(watched ==m_label3)
  {
      if(event->type() == QEvent::MouseButtonPress)
      {
          QMouseEvent* mouseEvent = (QMouseEvent*)event;
          if(mouseEvent->button() & Qt::LeftButton)
          {
              m_stateLabel->setText(QString("左键按下图片3"));
          }
          if(mouseEvent->button() & Qt::MidButton)
          {
              m_stateLabel->setText(QString("中键按下图片3"));
          }
          if(mouseEvent->button() & Qt::RightButton)
          {
              m_stateLabel->setText(QString("右键按下图片3"));
          }
          tmpImg = m_image3.transformed(matrix);
          m_label3->setPixmap(QPixmap::fromImage(tmpImg));
      }
      if(event->type() == QEvent::MouseButtonRelease)
      {
          m_stateLabel->setText(QString("鼠标释放图片3"));
          m_label3->setPixmap(QPixmap::fromImage(m_image3));
      }
  }

    //事件交给上层对话框进行处理
    return QDialog::eventFilter(watched,event);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kotlin —— 这次入门就不用放弃了
声明:本文是FEELS_CHAOTIC原创,已获其授权发布,未经原作者允许请勿转载
用户2802329
2018/08/07
1.7K0
Kotlin —— 这次入门就不用放弃了
Kotlin学习日志(一)TextView、Button、Toast的使用
介绍的话我就不说了,可以看我的第一篇关于Kotlin的文章,讲了为什么要用Kotlin的原因,进入正题,我们现在已经重新创建了一个Kotlin的项目,我在activity_main.xml文件中放了一个id为tv_hello的TextView和一个id为btn_test的Button, 然后在MainActivity.kt中的头部导入 贴一下布局文件activity_main.xml的的代码
晨曦_LLW
2020/09/25
1.5K0
Kotlin入门(2)让App开发变得更容易
上一篇文章介绍了如何搭建Kotlin的开发环境,可是这个开发环境依然基于Android Studio,而在Android Studio上使用Java进行编码,本来就是理所应当的,何必还要专门弄个Kotlin,这个Kotlin相比Java到底有哪些好处呢? 我们可以把Kotlin看作是Java的升级版,它不但完全兼容Java,而且极大精简了代码语法,从而使开发者专注于业务逻辑的编码,无需在繁琐的代码框架之间周旋。当然,若想充分运用Kotlin的优异特性,除了导入Kotlin的核心库,还得导入Kotlin的扩展库与Anko库。具体到编译配置文件,则要进行以下两处修改: 1、打开项目的build.gradle,补充添加anko的版本号声明,以及Kotlin扩展库的路径,完整的编译配置如下所示:
aqi00
2019/01/18
1.3K0
用 Kotlin 写 Android ,难道只有环境搭建这么简单?
bennyhuo
2017/05/05
8.1K0
使用Anko Layouts来开发Android ( 翻译)
导语: Kotlin现在已成为Android的另一官方语言。JetBrains针对Android开发者也推出了一些有用的库和工具。Anko Layouts是使用Kotlin针对Android布局写的一
MelonTeam
2018/01/04
2.1K0
Kotlin和anko融合进行Android开发
kotlin是一门基于jvm的编程语言,最近进行了关于kotlin和 anko的研究。并且结合现在的APP设计模式,设想了初步的开发方式。并且准备应用在新的项目中。 Kotlin和anko Kotlin是大名鼎鼎的JB公司开发的jvm语言,官网地址为;http://kotlinlang.org/ 官网的介绍为: Statically typed programming language for the JVM, Android and the browser Kotlin的设计思想非常的轻量,尽可能的去复用
xiangzhihong
2018/01/26
8090
hello Kotlin
1.1 Kotlin的身世 写了许久 Java,有没有发现其实你写了太多冗余的代码? 后来你体验了一下 Python,有没有觉得不写分号的感觉真是超级爽? 你虽然勤勤恳恳,可到头来却被 NullPoi
xiangzhihong
2018/02/05
9420
hello Kotlin
干货 | 实现一个属于你的“语言”-携程Kotlin DSL开发与实践
DSL(domain specific language),即领域专用语言:专门解决某一特定问题的计算机语言。由于它是以简洁的形式进行表达,整体上直观易懂,使得调用代码和读代码的成本都得以降低,即使是不懂编程语言的一般人都可以进行使用,所以近年来频频被提起,颇受关注。
携程技术
2019/09/16
1.6K0
干货 | 实现一个属于你的“语言”-携程Kotlin DSL开发与实践
kotlin-android-extensions插件也被废弃了?扶我起来
kotlin-android-extensions插件可能算得上是我最喜欢的一个Kotlin在Android上的特性了。
用户1158055
2021/01/29
3.9K0
Kotlin安卓开发学习(4)
前面我们学习了Kotlin 的基本语法,但我们最终的目的是作为安卓开发。因此,我们需要学习安卓的页面开发知识。
摸鱼的G
2023/02/22
6000
Kotlin入门(20)几种常见的对话框
手机上的App极大地方便了人们的生活,很多业务只需用户拇指一点即可轻松办理,然而这也带来了一定的风险,因为有时候用户并非真的想这么做,只是不小心点了一下而已,如果App不做任何提示的话,继续吭哧吭哧兀自办完业务,比如转错钱了、误删资料了,往往令用户追悔莫及。所以对于部分关键业务,App为了避免用户的误操作,很有必要弹出消息对话框,提醒用户是否真的要进行此项操作。这个提醒对话框便是App开发常见的AlertDialog,说起这个AlertDialog,安卓开发者都有所耳闻,该对话框不外乎消息标题、消息内容、确定按钮、取消按钮这四个要素,使用Java编码显示提醒对话框,基本跟下面的示例代码大同小异:
aqi00
2019/01/18
2.8K0
《Kotin 极简教程》第13章 使用 Kotlin 和 Anko 的Android 开发
Anko (https://github.com/Kotlin/anko) 是一个用 Kotlin 写的Android DSL (Domain-Specific Language)。长久以来,Android视图都是用 XML 来完成布局的。这些 XML可重用性比较差。同时在运行的时候,XML 要转换成 Java 表述,这在一定程度上占用了 CPU 和耗费了电量。
一个会写诗的程序员
2018/08/17
3.6K0
Kotlin学习之路(1)环境介绍及安装
最近发现很多公司对于Android开发者都要求又提升了一些,比如熟悉Kotlin的开发,会使用React Native,会使用Flutter开发语言,要么就会对前端有一定的基础小程序 Vue等等。。。 在众多知识中我选择学习Kotlin,其原因Kotlin作为谷歌霸霸主推的语言,而且它是一种兼容Java的语言,还有就是看到很多Android开发者都在使用Kotlin写项目。在大环境的驱使下,我选择学习这门新语言。
全栈程序员站长
2021/04/07
1.1K0
Kotlin 第二弹:Android 中 PDF 创建与渲染实践
这是 Kotlin 练习的的第二篇。这一篇的由来是因为刚刚在 Android 开发者官网查看 API 的时候,偶然看到了角落里面的 pdf 相关。
Frank909
2019/01/14
2.4K0
Kotlin 第二弹:Android 中 PDF 创建与渲染实践
Android 布局优化真的难,从入门到放弃
Android的绘制优化其实可以分为两个部分,即布局(UI)优化和卡顿优化,而布局优化的核心问题就是要解决因布局渲染性能不佳而导致应用卡顿的问题,所以它可以认为是卡顿优化的一个子集。
用户9239674
2022/01/08
9370
Kotlin学习总结
不需要findviewbyid 最新版 AS build.gradle 中默认引入 apply plugin: 'kotlin-android-extensions' 所以在代码中直接引用布局中的id就可以使用非常方便简洁。 Anko Anko是一个扩展库,提供了很多的扩展方法,可以写布局、数据库、和activity跳转toast等的通用方法。真的超级方便! 继承 kotlin中子类继承父类,父类要标记为open否则编译器会报错。 设计模式 java写项目的时候我们使用MVP模式会使用RxJava,那么K
longzeqiu
2020/03/26
4860
第14章 使用Kotlin 进行 Android 开发(1)第14章 使用Kotlin 进行 Android 开发(1)
根据Realm Report (2017-Q4,https://realm.io/realm-report/2017-q4 ) ,过去的一年在Android 端的开发:Java 从 95% 降低到 Java 85%, 而 Kotlin 从 5% 涨到 15% ,如下图所示
一个会写诗的程序员
2018/08/17
2.8K0
第14章 使用Kotlin 进行 Android 开发(1)第14章 使用Kotlin 进行 Android 开发(1)
Kotlin入门(23)适配器的进阶表达
前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统会自动回收相应的视图对象。随着用户的下拉或者上拉手势,已经被回收的列表项要重新加载到界面上,倘若每次加载都得从头创建视图对象,势必增加了系统的资源开销。所以ViewHolder便应运而生,它在列表项首次初始化时,就将其视图对象保存起来,后面再次加载该视图时,即可直接从持有者处获得先前的视图对象,从而减少了系统开销,提高了系统的运行效率。 视图持有者的设计理念固然美好,却苦了Android开发者,每次由BaseAdapter派生新的适配器类,都必须手工处理视图持有者的相关逻辑,实在是个沉重的负担。有鉴于此,循环视图的适配器把视图持有者的重用逻辑剥离出来,由系统自行判断并处理持有者的重用操作。开发者继承RecyclerView.Adapter之后,只要完成业务上的代码逻辑即可,无需进行BaseAdapter视图持有者的手工重用。 现在由Kotlin实现循环视图的适配器类,综合前面两小节提到的优化技术,加上视图持有者的自动重用,适配器代码又得到了进一步的精简。由于循环视图适配器并不提供列表项的点击事件,因此开发者要自己编写包括点击、长按在内的事件处理代码。为方便理解循环适配器的Kotlin编码,下面以微信的公众号消息列表为例,给出对应的消息列表Kotlin代码:
aqi00
2019/01/18
1.9K0
Android的ListView和RecyclerView的基本用法
在Android 5.0 版本之前,为了方便的显示多行数据,形如QQ聊天信息主界面,最常用的选择无非是ListView控件,但是ListView控件本身就有很大的局限性和效率问题(相对于RecyclerView控件)来说,比如说ListView只能竖向滚动显示数据,不能横向滚动显示数据,在一些特殊的需求中,ListView就无能为力了。在Android5.0版本之后,Android官方推出了一个新的控件:RecyclerView ,完全解耦的设计使得RecyclerView比起ListView灵活了太多,应用的场合也非常广泛。那么,就来看一下ListView和RecyclerView的用法和不同之处在哪:
指点
2019/01/18
1.2K0
Android的ListView和RecyclerView的基本用法
Kotlin学习日志(六)控件使用
学习最重要的就是坚持了,笨鸟多飞,业精于勤荒于嬉,学如逆水行舟,不进则退。前面学了那么多关于函数、语法、类这些知识,确实是比较枯燥,但却是有必要的,因为这些都是在进行业务实现需要的,举个例子,常规功能,登录。你有想过需要哪些业务逻辑处理吗?你不会以为输入账号密码就没事了吗?当然不是,登录首先是页面的布局处理,通常的是输入框和按钮的搭配,当然有的会有图形验证码,手势验证码,或者滑动验证等验证手段,最简单的就是只有账号和密码的登录,但是账号和密码也是要做限制的,登录的时候首先做非空判断,输入类型限制,比如账号指定是纯数字、还是数字加字母,一般来说是纯数字的,纯数字要限制多少位数,如果是手机号的话需要用正则表达式来验证是否为正规的手机号,总不能你输入个13888888888,我都能让你登录上去吧,那这个程序员也要开除,其次就是登录的时候与后台的数据库进行查询对比,假如没有这个手机号是不是还要先注册呢?然后密码当然不能明文显示,也不能明文传输啊,也不能是纯数字或者纯字母,特殊符号什么的,这里又涉及到了密码的安全登录,常见的是三级,纯数字是不行的,这一步你在注册的时候就过不去,然后是最短和最长的密码位数限制,一般来说最短8位最长18位,然后就是传输过程加密,后台对比数据库的值是否一致,一致再允许登录,进一步的出来就是登录过程中的网络处理了,网络请求多长时间,网络异常,等一些问题的处理,但是在用户眼里就是一个简单的登录而已,所以任何功能的设定都没有你实际看上去的那么简单,如果你想的过于简单的话,都不用到客户,测试就能玩死你,你信不信?好了,废话说的有点多了,接下来进入正题,Kotlin中控件的的使用。
晨曦_LLW
2020/09/25
1.9K0
Kotlin学习日志(六)控件使用
推荐阅读
相关推荐
Kotlin —— 这次入门就不用放弃了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验