PyQt5系列教程(29): QLineEdit 3

这期我们继续介绍一下文本输入栏(QLineEdit),先期我们总体介绍了下QLineEdit,做了一个相关的演示,并对其常用属性、信号、函数介绍及举例。这期主要介绍一些自定义密码输入框。

还记得

学点编程吧:PyQt5系列教程(12):构建我们自己的密码输入框zhuanlan.zhihu.com《PyQt5系列教程(29): QLineEdit 3》

中三种密码的输入方式吗?效果图如下:

《PyQt5系列教程(29): QLineEdit 3》

忘记了可以再去温习一下!

从实际使用的注册页面上看,一般用的比较多的是这样的(网易邮箱注册为例):

《PyQt5系列教程(29): QLineEdit 3》
《PyQt5系列教程(29): QLineEdit 3》

学点编程吧:PyQt5系列教程(27): 文本输入栏(QLineEdit)1zhuanlan.zhihu.com《PyQt5系列教程(29): QLineEdit 3》

中的视频中我们基本上实现了这个功能,在输入问题提示上没有网易邮箱那么全面,只是给出来了通用的提示信息。当然我们在输入上感知更好一些,先明后密,屏蔽了鼠标和关键键盘组合操作,更安全一些。

《PyQt5系列教程(29): QLineEdit 3》
《PyQt5系列教程(29): QLineEdit 3》

其实还有一个密码输入软键盘的问题,我已经设计好了,但是不属于这个知识点,不做讲解,等后期碰到相关的知识点再做讲解。

在本章我主要讲解一下密文如何实现先明后密的,至于判断两次密码是否一致,密码强度问题,只要设置好相应的正则表达式进行匹配就行了。

设计思路

当我们输入密码的时候,它显示的是明文,但是由于里面有一个时间机制在里面,一定时间内它会自动将文本输入框里面的内容覆盖为“*”,所以我们填写密码的时候就好像先是有明文紧接着变成密文样的。

流程大致如下图所示:

《PyQt5系列教程(29): QLineEdit 3》
《PyQt5系列教程(29): QLineEdit 3》

核心代码

这里我们继承了QLineEdit这个类并自定义一个新类PwdLineEdit。我们定义了两个成员变量:

self.m_LineEditText = ""
self.m_LastCharCount = 0

分别用以记录真实的密码和密码出现变化的长度。

1、在程序中我们用到了两个信号发射:

self.cursorPositionChanged[int,int].connect(self.DisplayPasswordAfterEditSlot)
self.textEdited[str].connect(self.GetRealTextSlot)

第一个信号是在光标发生移动时产生,返回两个整型变量并调用槽函数DisplayPasswordAfterEditSlot(),用以显示密文;
第二个信号是在文本编辑时产生,调用槽函数GetRealTextSlot(),用以记录真实的密码。

2、如何在让输入的明文自动的变成密文呢?我使用了QTimer类,设置超时时间是为200毫秒,然后自动调用DisplayPasswordSlot()。

self.time = QTimer(self)
self.time.setInterval(200)
self.time.start()
def DisplayPasswordAfterEditSlot(self, old, new):
    if old >= 0 and new >= 0:
        if new > old:
            self.time.timeout.connect(self.DisplayPasswordSlot)
        else:
            self.setCursorPosition(old)

这里的old和new分别表示光标移动前后的位置,要是new > old,明显就是在输入密码,增加密码长度;反之就是在删除密码字符。就是这个样子:

《PyQt5系列教程(29): QLineEdit 3》
《PyQt5系列教程(29): QLineEdit 3》

3、显示密文我们是怎么做到的呢?

mask = ""
count = len(self.text())
if count > 0:
    for i in range(count):
     mask += "*"

我们判断输入的长度,然后用几个”*”覆盖掉,最后通过setText(),覆盖掉文本输入框。因为有时间延时,所以就好像每写一个就隐藏一个样的。很神奇是吧!

4、还有最关键的步骤,记录真正的密码,也就是我们输入的内容。

def GetRealTextSlot(self, text):
    self.m_LastCharCount = len(self.m_LineEditText)
    if len(text) > self.m_LastCharCount:
        self.m_LineEditText += text[-1]
    elif len(text) <= self.m_LastCharCount:
        self.m_LineEditText = self.m_LineEditText[:-1]

当密码在输入的时候会自动的调用GetRealTextSlot()这个函数。

self.m_LastCharCount记录了当前没有变化时密码的长度。如果当前的长度大于之前记录的密码长度,很明显,密码在新增字符,所有实际密码是self.m_LineEditText += text[-1],即将新增的字符和原有的密码进行合并。

反之,就删除最后一个字符,所以就用到了self.m_LineEditText = self.m_LineEditText[:-1]。这句话要是大家不理解,我举个简单的例子就明白了。还是看下动画吧。注意看str的变化!

《PyQt5系列教程(29): QLineEdit 3》
《PyQt5系列教程(29): QLineEdit 3》

动画中字符串str是不断地减少的,其本质是每次取字符串第0位到最后一位(不含)的字符串。

其它

关于如何屏蔽鼠标右键或者键盘的一些操作,可以参见

学点编程吧:PyQt5系列教程(12):构建我们自己的密码输入框zhuanlan.zhihu.com《PyQt5系列教程(29): QLineEdit 3》

这里就不再重复了。

最后

ok,今天的介绍暂时就到这里吧,更多关于QLineEdit的内容下期我们再见,下篇自动补全篇。如果你喜欢本篇文章,请给我点赞

《PyQt5系列教程(29): QLineEdit 3》
《PyQt5系列教程(29): QLineEdit 3》

赞赏(推荐

《PyQt5系列教程(29): QLineEdit 3》

分享给你的好友们吧!

《PyQt5系列教程(29): QLineEdit 3》

全部的源码将在本期更完后,一起公布!

关注微信公众号:学点编程吧,你可以学到更多~!

实操中有问题?来讨论吧!

学点编程吧-百度贴吧–计算机程序学习的园地!–学点编程吧,让我们的生活更简单,更高效!能用计算机解决的事情,尽量不要让人解决。如果你在学习当中有任何疑问、学习心得、职业发展等内容欢迎在贴吧中分享,让我tieba.baidu.com《PyQt5系列教程(29): QLineEdit 3》

    原文作者:学点编程吧
    原文地址: https://zhuanlan.zhihu.com/p/34139521
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞