QLineEdit 文本輸入
1、QlineEdit 基本方法
setAlignment()
按固定值方式對齊文本正則表達式
Qt.AlignLeft:水平方向靠左對齊編程
Qt.AlignRight:水平方向靠右對齊函數
Qt.AlignCenter:水平方向居中對齊佈局
Qt.AlignJustify:水平方向調整間距兩端對齊動畫
Qt.AlignTop:垂直方向靠上對齊加密
Qt.AlignBottom:垂直方向靠下對齊url
Qt.AlignVCenter:垂直方向居中對齊spa
setEchoMode()
設置文本框的顯示格式,容許輸入的文本顯示格式的值能夠是:.net
QLineEdit.Normal:正常顯示所輸入的字符,此爲默認選項設計
QLineEdit.NoEcho:不顯示任何輸入的字符,經常使用於密碼類型的輸入,且長度保密
QLineEdit.Password:顯示與平臺相關的密碼掩飾字符,而不是實際輸入的字符
QLineEdit.PasswordEchoOnEdit:在編輯時顯示字符,負責顯示密碼類型的輸入
setPlaceholderText()
設置文本框顯示文字
setMaxLength()
設置文本框所容許輸入的最大字符數
setReadOnly()
設置文本爲只讀
setText()
設置文本框的內容
text()
返回文本框的內容
setDragEnable()
設置文本框是否接受拖動
selectAll()
全選
setFocus()
獲得焦點
setInputMask()
設置掩碼
setValidator()
設置文本框的驗證器(驗證規則),將限制任意可能輸入的文本,可用的校驗器爲
QIntValidator:限制輸入整數
QDoubleValidator:限制輸入浮點數
QRegexpValidator:檢查輸入是否符合正則表達式
setFont()
e1.setFont(QFont('Arial',20))
QLineEdit() 信號:
selectionChanged
只要選擇改變了,這個信號就會發射
textChanged
當修改文本內容時,這個信號就會發射
editingFinished
當編輯文本結束時,這個信號就會發射
2、介紹一個QLineEdit() 小案例,主要分爲如下幾章:
1.QLineEdit()經常使用屬性、信號、函數介紹及舉例
2. 密碼的輸入表示
3. 文本輸入欄的自動補全
4.密碼的輸入和文本輸入欄的自動補全
公用類型
QLineEdit.ActionPosition
描述如何顯示加入到輸入框中的action部件。
QLineEdit.EchoMode
描述輸入框如何顯示其內容。
舉個小例子吧
主要是針對ActionPosition舉例,EchoMode的例子在下章。
![](http://static.javashuo.com/static/loading.gif)
這個例子當中,咱們對拼寫的單詞進行了檢查,發現計算機可以猜想出咱們可能拼寫錯誤的單詞,並給出拼寫建議。
單詞拼寫檢查的代碼來源互聯網(感謝原做者):Python寫一個簡潔拼寫檢查器 - CSDN博客
class Line(QDialog): def Ui(self): self.line = QLineEdit(self) self.line.move(20,20) action = QAction(self) action.setIcon(QIcon('check.ico')) action.triggered.connect(self.Check) self.line.addAction(action,QLineEdit.TrailingPosition) #對QAction對象的位置進行設定,設定在文本右邊 def Check(self): word = self.line.text() QMessageBox.information(self,'提示信息框','你輸入的用戶名是: %s"%word)
Qt.LeftToRight、Qt.RightToLeft是什麼意思呢?
它指定了Qt佈局和文本處理的方向。
對於某些語言,從右到左佈局是必需的,特別是阿拉伯語和希伯來語。
LayoutDirectionAuto 有兩個用途,當與小部件和佈局一塊兒使用時,它將暗示使用在父小部件或QApplication上設置的佈局方向。
這與QWidget. unsetLayoutDirection()具備相同的效果。當LayoutDirectionAuto與文本佈局結合使用時,它將暗示文本的方向性取決於要展開的字符串內容。
經常使用接口
一些經常使用接口的舉例
- QLineEdit.text():返回輸入框的當前文本。
- QLineEdit.addAction(Action,QLineEdit.ActionPosition):添加動做到文本輸入欄,上面已經舉過例子了。
- QLineEdit.setAlignment(Qt.Alignment flag):屬性保存了輸入框的對齊方式(水平和垂直方向。這個知識點在
學點編程吧:PyQt5系列教程(21):標籤(QLabel)zhuanlan.zhihu.com
有過介紹,詳情請點擊。
- QLineEdit.setCompleter() :輸入欄的自動補全就是靠這個實現的,下下章咱們講解。
- QLineEdit.deselect() :取消選中任何已選中的文本。
- QLineEdit.displayText():返回顯示的文本。默認值爲一個空字符串。
- 若是echoMode是Normal,和text()返回的同樣;若是EchoMode是Password或PasswordEchoOnEdit,會返回平臺相關的密碼掩碼字符;若是EchoMode是NoEcho,返回一個空字符串」」。
- QLineEdit.selectedText():返回選中的的文本。若是沒有選中,返回一個空字符串。默認爲一個空字符串。
- QLineEdit.setCursorPosition(QLineEdit.cursorPosition):設置輸入框當前光標的位置。
- QLineEdit.setMaxLength(int):此屬性包含文本的最大容許長度。若是文本太長,將從限制的位置截斷。默認值爲32767。
- QLineEdit.setReadOnly(bool):此屬性保存輸入框是否爲只讀。在只讀模式下,用戶仍然能夠將文本複製到剪貼板,但不能編輯它,且不顯示光標。
- QLineEdit.setSelection(int start, int length) :從位置start選擇文本爲length個字符,容許負長度。咱們一啓動程序是否設置setSelection的,效果以下:
- QLineEdit.setValidator():設置輸入框的驗證器,將限制任意可能輸入的文本。
- 咱們在學點編程吧:PyQt5系列教程(12):構建咱們本身的密碼輸入框zhuanlan.zhihu.com有過介紹,詳情請點擊。
- QLineEdit.setPlaceholderText(str):該屬性包含行編輯的佔位符文本。只要行編輯爲空,設置此屬性將使行編輯顯示一個灰色的佔位符文本。
一般狀況下,即便具備焦點,空行編輯也會顯示佔位符文本。可是,若是內容是水平居中的,則行編輯具備焦點時,佔位符文本不會顯示在光標下方。默認狀況下,該屬性包含一個空字符串。
- QLineEdit.isClearButtonEnabled(bool) :是否設置清除內容的按鈕。
- QLineEdit.setInputMask():設置掩碼,效果就是咱們演示視頻中的License輸入。
下表列出了可在一個輸入掩碼中使用的字符。 空格字符是空格的默認字符,對於容許但不須要字符的狀況須要。
掩碼由掩碼字符和分隔符字符串組成,後面能夠跟一個分號和用於空白的字符,空白字符在編輯後老是從文本中刪除。
例如:
效果就是下面這個樣子的:
![](http://static.javashuo.com/static/loading.gif)
信號
- selectionChanged() :只要選擇改變這個信號就會被髮射。
- cursorPositionChanged(int old, int new) :只要光標移動,這個信號就會發射。前面的位置old,新的位置是new。
- editingFinished():按下返回或回車鍵或線條編輯失去焦點時發出此信號。
- returnPressed():按下返回或回車鍵時發出此信號。
- textChanged(str):只要文字發生變化就會發出此信號。文本參數是新文本。與textEdited()不一樣,當經過調用setText()以編程方式更改文本時,也會發出此信號。
- textEdited(str) :不管什麼時候編輯文本都會發出此信號。文本參數是新文本。與textChanged()不一樣,當以編程方式更改文本時,不會發出此信號,例如經過調用setText()。
咱們以editingFinished()爲例,視頻演示中主要也用到了這個信號發射,若是完成相應的內容在最後的一欄進行檢測。
![](http://static.javashuo.com/static/loading.gif)
self.line = QLineEdit(self) lb = QLabel('IP地址',self) self.line.editingFinished.connect(self.Action) self.line.setInputMask('000.000.000.000;_') def Action(self): if len(self.line.text()) > 3: QMessageBox.information(self,'提示信息', '這行你完成了哦')
函數
- clear() :清除輸入框內容
- copy():若是echoMode()是Normal,將選中的文本複製到剪貼板。
- cut() :若是echoMode()是Normal,將所選文本複製到剪貼板並刪除它。 若是當前的驗證不容許刪除選定的文本,cut()將複製而不刪除。
- paste() :若是輸入框不是隻讀的,插入剪貼板中的文本到光標所在位置,刪除任何選定的文本。若是最終的結果不被當前的驗證器接受,將沒有任何反應。
- redo() :重作上次操做,若是redo可用(isRedoAvailable() )。
- selectAll() :選中全部文本(即:高亮),並將光標移動到末尾。當一個默認值被插入時,這很是有用,由於若是用戶在點擊部件以前就輸入,選中的文本將被刪除。
- setText(str) :設置輸入框顯示的文本。
- undo() :撤消上次操做(若是撤銷可用)
其它
咱們在視頻演示中,如何判斷輸入的字符是否符合相應的要求呢?使用正則表達式,即便用re模塊。這裏咱們舉一個例子:
regex_phone = '^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$' phone = self.lineEdit_4.text() rr1 = re.compile(regex_phone) if rr1.match(phone) is None: self.lineEdit_6.setText('請填寫正確的手機號!')
咱們首先寫一個手機號碼的正則表達式(這個網上不少),而後使用re.compile()編譯一下,這樣效率會高一些,再使用match()進行匹配,若是匹配上就返回匹配上的字符串,否就不返回。詳見:
下面將介紹密碼的輸入方法,密碼的3種輸入方式,效果圖以下:
https://zhuanlan.zhihu.com/p/30152208
從實際使用的註冊頁面上看,通常用的比較多的是這樣的(網易郵箱註冊爲例):
在 https://zhuanlan.zhihu.com/p/34008281 專欄中的視頻中咱們基本上實現了這個功能,在輸入問題提示上沒有網易郵箱那麼全面,只是給出來了通用的提示信息。
固然咱們在輸入上感知更好一些,下面講解一下密碼輸入 先明後密,屏蔽鼠標和關鍵鍵盤組合操做 的案例,至於判斷兩次密碼是否一致,密碼強度問題,只要設置好相應的正則表達式進行匹配就好了。
其實還有一個密碼輸入軟鍵盤的問題,我已經設計好了,可是不屬於這個知識點,不作講解,等後期碰到相關的知識點再作講解。
設計思路
當咱們輸入密碼的時候,它顯示的是明文,可是因爲裏面有一個時間機制在裏面,必定時間內它會自動將文本輸入框裏面的內容覆蓋爲「*」,因此咱們填寫密碼的時候就好像先是有明文緊接着變成密文樣的。
核心代碼
這裏咱們繼承了QLineEdit這個類並自定義一個新類PwdLineEdit。咱們定義了兩個成員變量:
self.m_LineEditText = "" self.m_LastCharCount = 0
分別用以記錄真實的密碼和密碼出現變化前的長度。
一、在程序中咱們用到了兩個信號發射:
self.cursorPositionChanged[int,int].connect(self.DisplayPasswordAfterEditSlot) self.textEdited[str].connect(self.GetRealTextSlot)
第一個信號是在光標發生移動時產生,返回兩個整型變量並調用槽函數 DisplayPasswordAfterEditSlot(),用以顯示密文;
第二個信號是在文本編輯時產生,調用槽函數 GetRealTextSlot(),用以記錄真實的密碼。
二、如何在讓輸入的明文自動的變成密文呢?我使用了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,明顯就是在輸入密碼,增長密碼長度;反之就是在刪除密碼字符。就是這個樣子:
![](http://static.javashuo.com/static/loading.gif)
三、顯示密文咱們是怎麼作到的呢?
mask = "" count = len(self.text()) if count > 0: for i in range(count): mask += "*"
咱們判斷輸入的長度,而後用幾個」*」覆蓋掉,最後經過setText(),覆蓋掉文本輸入框。由於有時間延時,因此就好像每寫一個就隱藏一個樣的。很神奇是吧!
四、還有最關鍵的步驟,記錄真正的密碼,也就是咱們輸入的內容。
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的變化!
![](http://static.javashuo.com/static/loading.gif)
動畫中字符串str是不斷地減小的,其本質是每次取字符串第0位到最後一位(不含)的字符串。
其它
關於如何屏蔽鼠標右鍵或者鍵盤的一些操做,能夠參見
學點編程吧:PyQt5系列教程(12):構建咱們本身的密碼輸入框zhuanlan.zhihu.com
這裏就再也不重複了。