我們在前面學習了各種按鈕控件,從這一章開始就是各種輸入控件的學習。
首先要用的就是QLineEdit——單行編輯器,
一描述
QLineEdit是一個單行文本編輯器,允許用戶輸入和編輯單行純文本。自帶一些編輯例如撤銷、重做、剪切、粘貼等功能。
QLineEdit繼承自QWidget類,具備父類各種API。
二.功能作用
1.創建控件,設置、獲取文本
這個很簡單,沒啥說的
le = QLineEdit(window) le = QLineEdit('默認字符',window) #控件創建 le.setText() #設置字符串 le.insert('插入的字符串') #從光標處插入字符串 le.text() #獲取真是的文本字符 le.displayText() #獲取用戶能看到的字符串
注意的是最后兩個,如果控件是密碼輸入框的時候,輸入的字符用戶看的是*或者黑點。那用最后一個獲取的字符就是你看到的字符。而用le.text()獲得的就是真是的文本。
2.輸出模式
文本框的文本輸出模式按下面的枚舉值看有這四種
QLineEdit.setEchoMode(QLineEdit.Normal) #設置輸出模式 QLineEdit.echoMode() #獲取輸出模式(int) #輸出模式枚舉值 QLineEdit.Normal #正常顯示,返回值0 QLineEdit.NoEcho #不顯示,返回值1 QLineEdit.Password #密文顯示,返回值2 QLineEdit.PasswordEchoOnEdit #編輯時正常顯示,失去焦點后變密文
3.占位提示符
有些時候在打開一個界面時對話框是有提示文本的,當輸入內容后文本消失被輸入的值替代,這就是占位提示符的作用
占位提示符的用法
QLineEdit.setPlaceholderText('占位文本') #設置占位文本 QLineEdit.placeholderText() #獲取占位文本
4清空按鈕
平時不顯示,有字符時會出現一個‘叉叉
'
單機叉叉后清除所有文本。就是清空按鈕的作用
QLineEdit.setClearButtonEnabled(True) #設置清空按鈕開啟 QLineEdit.isClearButtonEnabled() #獲取是否開啟清空按鈕
結合上面的用法可以做第一個案例:登陸對話框,要求如下
a.兩個對話框,一個輸入賬號,一個輸入密碼。
b.賬號框為明文,密碼框用密文
c.測試用賬戶名為abc,密碼為123,賬戶不存在時清空兩個文本框,密碼錯誤時清空密碼框
d.增加標簽,顯示登陸情況
e.用面向對象的方式編程。

from PyQt5.Qt import * from PyQt5 import QtGui import sys class Window(QWidget): def __init__(self): super().__init__() self.resize(500,800) self.setMinimumSize(300,300) #登陸窗口最小尺寸 self.UI_test() def UI_test(self): self.le_account = QLineEdit(self) self.le_account.move(self.width() / 2 - self.le_account.width()/2, self.height() / 2 - 50) # self.le_account.move(0,0) self.le_account.resize(200,30) self.le_account.setPlaceholderText('請輸入賬號') self.le_password = QLineEdit(self) self.le_password.move(self.width() / 2 - self.le_password.width()/2, self.height() / 2) self.le_password.setEchoMode(QLineEdit.Password) self.le_password.setPlaceholderText('請輸入密碼') self.le_password.resize(200, 30) self.btn = QPushButton('登陸',self) self.btn.resize(100,30) self.btn.move(self.width() / 2 -self.btn.width()/2, self.height() / 2 + 50) self.btn.clicked.connect(self.checkin) self.label = QLabel(self) self.label.resize(150,50) self.label.move(self.width()/2,self.height()/2+100) self.label.setText('請登陸') self.label.setStyleSheet('background-color:cyan') def resizeEvent(self, a0: QtGui.QResizeEvent): print(self.size()) self.le_account.move(self.width() / 2 - self.le_account.width()/2, self.height() / 2 - 50) self.le_password.move(self.width() / 2 - self.le_password.width()/2, self.height() / 2) self.le_password.setEchoMode(QLineEdit.Password) self.btn.move(self.width() / 2 -self.btn.width()/2, self.height() / 2 + 50) self.label.move(self.width() / 2-self.label.width()/2, self.height() / 2 + 100) print(self.le_account.pos()) print(self.le_account.size()) def checkin(self): account = self.le_account.text() pwd = self.le_password.text() if account != 'abc': self.le_account.setText('') self.le_password.setText('') self.label.setText('賬號不存在') elif pwd != '123': self.le_password.setText('') self.label.setText('密碼錯誤') else: self.label.setText('登陸成功') self.label.adjustSize() if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
這個就是個最簡單的GUI了,但是還有個可以改進的地方:把程序的邏輯部分和GUI的部分獨立開來
5.自動補全聯想
有些時候(比如在登陸界面輸入賬號)當輸入第一個字符后會有自動補全的功能
list = ['aaron','back','click','disc'] #自動補全的數據列表 completer = QCompleter(list,le) #commpeter的生命周期歸屬於le的存在 QLineEdit.setCompleter(completer) print(le.completer())
6.光標控制
首先我們要了解光標移動的方向由於在文本框內字符是按照從左往右的方式輸入的
那么,左邊就認為是后端(back),而右邊就是前端(forward)
下面就是移動光標的用法
QLineEdit.cursorBackward(mark=True,steps=0) #向左移動step個字符,mark為True時帶選中效果 QLineEdit.cursorForward(mark=True,steps=0) #向右移動step個字符,mark為True時帶選中效果 QLineEdit.cursorWordBackward(mark=True) #向左移動一個單詞的長度,mark為True時帶選中效果 QLineEdit.cursorWordForward(mark=True) #向右移動一個單詞的長度,mark為True時帶選中效果 QLineEdit.home(mark=True) #光標移動至行首,mark為True時帶選中效果 QLineEdit.end(mark=True) #光標移動至行尾,mark為True時帶選中效果 QLineEdit.setCursorPosition(pos=8) #光標移動至指定位置(如果pos為小數則向下取整) QLineEdit.cursorPosition() #獲取光標位置
這里要注意的時焦點的問題,因為改變光標的位置的前提是對話框是獲取焦點的,但是如果點擊了按鈕或其他方式調用了API可能對話框就失去了焦點,就沒有改變光標的效果了。
7.文本長度限制
可以設定文本框的限制長度,當輸入的文本超過設定值時是無法再輸入的。
QLineEdit.setMaxLength() #長度限制設定 QLineEdit.maxLength() #獲取長度限定值
8.只讀模式
可以將文本框設置為只讀模式,設置后文本無法更改
QLineEdit.setReadOnly(True) #設定為只讀模式 QLineEdit.isReadOnly() #獲取控件是否設定為只讀模式
9.邊距設置
默認情況下文本框內的文本是再文本框中左對齊居中的,即便是一個比較大的框框。
我們再QWidget里有個內容邊距,
le.setContentsMargins(80,20,20,20)
這個是文本框和外部的輪廓的距離,出來就是這樣的了
背景都變了把,其實我們只是向讓文本的位置發生變化,就要用QLineEdit類里的功能
QLineEdit.setTextMargins(left=,top=,right=,bottom=) #設置文本邊距 QLineEdit.textMargins() #獲取文本邊距
就可以改變文本的邊距
le.setTextMargins(80,20,20,20)
看看是不是改變了文本的位置!
10.對齊方式
對齊方式的設定API
QLineEdit.setAlignment(Qt.AlignHCenter) #設置對齊方式 QLineEdit.alignment() #獲取對齊方式 #枚舉值 Qt.AlignHCenter #水平居中 Qt.AlignLeft #水平靠左 Qt.AlignRight #水平靠右 Qt.AlignTop #垂直靠上 Qt.AlignVCenter #垂直居中 Qt.AlignBottom #垂直靠下 Qt.AlignCenter #居中
在設定的時候可以用管道符"|"同時設定水平和垂直的效果
le.setAlignment(Qt.AlignRight|Qt.AlignBottom)
11.常用的編輯功能
QLineEdit可以用代碼實現常規的編輯功能:撤銷、復制、剪切、粘貼等等。
QLineEdit.backspace() # 刪除光標左側字符或選中的文本 QLineEdit.del_() # 刪除光標右側字符或選中文本 QLineEdit.cQLineEditar() # 刪除文本框所有內容 QLineEdit.copy() QLineEdit.cut() QLineEdit.paste() QLineEdit.isUndoAvailabQLineEdit() # 是否可執行撤銷動作 QLineEdit.undo() QLineEdit.isRedoAvailabQLineEdit() # 是否可執行重做動作 QLineEdit.redo() QLineEdit.setDragEnabQLineEditd(True) # 設置文本可拖放 QLineEdit.seQLineEditctAll()
這里有個小細節要注意:我們通過代碼實現鼠標復制字符后再粘貼時要注意復制后是選中的狀態,不能直接粘貼,應該把光標移動並不用選中狀態。
還有文本的選中狀態
QLineEdit.setSeQLineEditction(0, 4) #選中指定范圍的文本(起始位,長度) QLineEdit.seQLineEditctAll() #選中所有文本 QLineEdit.deseQLineEditct() #取消選中文本 QLineEdit.hasSeQLineEditctedText() #是否有選中文本 QLineEdit.seQLineEditctionStart() #獲取選中起始位置 QLineEdit.seQLineEditctionEnd() #獲取選中結束位置 QLineEdit.seQLineEditctionQLineEditngth() #獲取選中字符長度
選中狀態的獲取要注意的細節就是如果用按鈕獲取選中是狀態時會改變焦點,而焦點改變后文本框的選中狀態就沒有了。
12.文本修改狀態
這個的用途還不太清楚,就把API列出來吧
QLineEdit.isModified() #文本是否處於被更改 QLineEdit.setModified(False) #取消文本被更改的狀態
13.添加自定義行為
前面講的都是QLineEdit的簡單的用法,下面講幾個復雜的API,這一節就講添加自定義行為,他可以為文本框添加附加的行為操作。為對話框添加一個圖標,當圖標被點擊時有相應的行為。就像一般登陸時的密碼框,旁邊都有個小眼睛,默認時候密碼是不可見的,點擊眼睛密碼就成明文的了。先放兩個圖標
當點擊圖標時可以切換明文和密文的顯示
action = QAction(le) action.setIcon(QIcon('open.png')) le.addAction(action,QLineEdit.LeadingPosition) # QLineEdit.TrailingPosition #在文本框后端顯示圖標 # QLineEdit.LeadingPosition #在文本框前端顯示圖標 def change_action(): pass action.triggered.connect(change_action) #行為觸發程序
程序就是這樣的

import sys from PyQt5.Qt import * app = QApplication(sys.argv) window = QWidget() window.resize(800,600) le = QLineEdit(window) le.setEchoMode(QLineEdit.Password) action = QAction(le) action.setIcon(QIcon('close.png')) le.addAction(action,QLineEdit.LeadingPosition) def change_action(): if le.echoMode() == 2: action.setIcon(QIcon('open.png')) le.setEchoMode(QLineEdit.Normal) else: action.setIcon(QIcon('close.png')) le.setEchoMode(QLineEdit.Password) action.triggered.connect(change_action) #行為觸發程序 window.show() sys.exit(app.exec_())
14.內容文本限制
內容文本的限制有兩種方式:驗證器和掩碼限制。這個用法以后再總結吧
三.常用信號
1.文本被編輯
QLineEdit.textEdited(text)
文本被編輯(只要是編輯,哪怕文本沒有改變)時發射信號,帶有參數(文本框內容)。但是只有用戶編輯時會觸發,用setText()是沒用的!
2.文本被改變
QLineEdit.textChanged(text)
這個和上面的基本一樣,不過是只要文本發生變化就會觸發信號,包括通過代碼改變的文本。
3.回車鍵按下
QLineEdit.returnPressed()
當回車鍵被按下時觸發,無參數傳遞
4.結束編輯
QLineEdit.editingFinished()
文本結束編輯時觸發(包括按下回車鍵和失去焦點)
5.光標位置發生改變
QLineEdit.cursorPositionChanged(self, a0: int, a1: int)
光標位置發生改變時觸發,傳遞兩個參數:a0:是光標初始位置;a1:光標移動后位置
6.選中文本發生變化
QLineEdit.selectionChanged()
選中的文本發生變化時觸發,無參數傳遞。
QLineEdit類學習總結完畢!