標籤:

PyQt5系列教程(29): 文本輸入欄(QLineEdit)3

這期我們繼續介紹一下文本輸入欄(QLineEdit),先期我們總體介紹了下QLineEdit,做了一個相關的演示,並對其常用屬性、信號、函數介紹及舉例。這期主要介紹一些自定義密碼輸入框。

還記得

學點編程吧:PyQt5系列教程(12):構建我們自己的密碼輸入框?

zhuanlan.zhihu.com圖標

中三種密碼的輸入方式嗎?效果圖如下:

忘記了可以再去溫習一下!

從實際使用的註冊頁面上看,一般用的比較多的是這樣的(網易郵箱註冊為例):

學點編程吧:PyQt5系列教程(27): 文本輸入欄(QLineEdit)1?

zhuanlan.zhihu.com圖標

中的視頻中我們基本上實現了這個功能,在輸入問題提示上沒有網易郵箱那麼全面,只是給出來了通用的提示信息。當然我們在輸入上感知更好一些,先明後密,屏蔽了滑鼠和關鍵鍵盤組合操作,更安全一些。

其實還有一個密碼輸入軟鍵盤的問題,我已經設計好了,但是不屬於這個知識點,不做講解,等後期碰到相關的知識點再做講解。

在本章我主要講解一下密文如何實現先明後密的,至於判斷兩次密碼是否一致,密碼強度問題,只要設置好相應的正則表達式進行匹配就行了。

設計思路

當我們輸入密碼的時候,它顯示的是明文,但是由於裡面有一個時間機制在裡面,一定時間內它會自動將文本輸入框裡面的內容覆蓋為「*」,所以我們填寫密碼的時候就好像先是有明文緊接著變成密文樣的。

流程大致如下圖所示:

核心代碼

這裡我們繼承了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,明顯就是在輸入密碼,增加密碼長度;反之就是在刪除密碼字元。就是這個樣子:

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的變化!

動畫中字元串str是不斷地減少的,其本質是每次取字元串第0位到最後一位(不含)的字元串。

其它

關於如何屏蔽滑鼠右鍵或者鍵盤的一些操作,可以參見

學點編程吧:PyQt5系列教程(12):構建我們自己的密碼輸入框?

zhuanlan.zhihu.com圖標

這裡就不再重複了。

最後

ok,今天的介紹暫時就到這裡吧,更多關於QLineEdit的內容下期我們再見,下篇自動補全篇。如果你喜歡本篇文章,請給我點贊

讚賞(推薦

分享給你的好友們吧!

全部的源碼將在本期更完後,一起公布!

關注微信公眾號:學點編程吧,你可以學到更多~!

推薦閱讀:

PyQt5系列教程(32): 純文本輸入框(QPlainTextEdit)2--這次沒翻車
cmd打命令的時候,有時參數是個很長的路徑,輸入非常麻煩,怎樣解決?
PyQt5系列教程(18):微調框1
PyQt4教程的對話框(QInputDialog)例子里的一段代碼,為什麼要這樣寫?
PyQt5系列教程(17):跑馬燈(進度條的使用)

TAG:PyQt5 | | PyQt | Python |