PyQt5系列教程(29): 文本輸入欄(QLineEdit)3
這期我們繼續介紹一下文本輸入欄(QLineEdit),先期我們總體介紹了下QLineEdit,做了一個相關的演示,並對其常用屬性、信號、函數介紹及舉例。這期主要介紹一些自定義密碼輸入框。
還記得
學點編程吧:PyQt5系列教程(12):構建我們自己的密碼輸入框中三種密碼的輸入方式嗎?效果圖如下:
忘記了可以再去溫習一下!
從實際使用的註冊頁面上看,一般用的比較多的是這樣的(網易郵箱註冊為例):
在
學點編程吧:PyQt5系列教程(27): 文本輸入欄(QLineEdit)1中的視頻中我們基本上實現了這個功能,在輸入問題提示上沒有網易郵箱那麼全面,只是給出來了通用的提示信息。當然我們在輸入上感知更好一些,先明後密,屏蔽了滑鼠和關鍵鍵盤組合操作,更安全一些。
其實還有一個密碼輸入軟鍵盤的問題,我已經設計好了,但是不屬於這個知識點,不做講解,等後期碰到相關的知識點再做講解。
在本章我主要講解一下密文如何實現先明後密的,至於判斷兩次密碼是否一致,密碼強度問題,只要設置好相應的正則表達式進行匹配就行了。
設計思路
當我們輸入密碼的時候,它顯示的是明文,但是由於裡面有一個時間機制在裡面,一定時間內它會自動將文本輸入框裡面的內容覆蓋為「*」,所以我們填寫密碼的時候就好像先是有明文緊接著變成密文樣的。
流程大致如下圖所示:
核心代碼
這裡我們繼承了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):構建我們自己的密碼輸入框這裡就不再重複了。
最後
ok,今天的介紹暫時就到這裡吧,更多關於QLineEdit的內容下期我們再見,下篇自動補全篇。如果你喜歡本篇文章,請給我點贊
讚賞(推薦)
分享給你的好友們吧!
全部的源碼將在本期更完後,一起公布!
關注微信公眾號:學點編程吧,你可以學到更多~!
推薦閱讀:
※PyQt5系列教程(32): 純文本輸入框(QPlainTextEdit)2--這次沒翻車
※cmd打命令的時候,有時參數是個很長的路徑,輸入非常麻煩,怎樣解決?
※PyQt5系列教程(18):微調框1
※PyQt4教程的對話框(QInputDialog)例子里的一段代碼,為什麼要這樣寫?
※PyQt5系列教程(17):跑馬燈(進度條的使用)