pyQt5 学习笔记(18)QLineEdit 单行文本输入 | 您所在的位置:网站首页 › 输入和编辑文本 › pyQt5 学习笔记(18)QLineEdit 单行文本输入 |
文章目录
一、QLineEdit 简介二、QLineEdit 的创建三、功能(API)1. 文本的设置与获取2. 显示模式3. 占位提示文本框4. 清空按钮显示5. 添加操作行为1. 添加一个Action2. 添加 Action 动作
6. 自动补全7. 输入限制1.设置长度和只读2. 验证器的使用2.1 创建和使用2.2 验证器返回和修复函数2.3 系统提供子类验证器的使用
3. 掩码的设置
8. 文本框的编辑状态9. 光标控制10. 文本边距设置11. 文本对齐设置12. 常用编辑功能
四、信号
一、QLineEdit 简介
QLineEdit 控件是一个单行文本输入框,它继承自QWidget,是一个纯文本的输入框,接收键盘的输入,可显示为明文(如QQ登录框中的账号框)或者是密文(如QQ登录框中的密码框)。 二、QLineEdit 的创建创建单行文本框: from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QLineEdit") w.resize(210,110) #创建一个单行文本框 le = QLineEdit(w) w.show() if __name__ == '__main__': sys.exit(app.exec_())运行: 运行: QLineEidt 显示文本可以用户主动输入,也可以由程序设置显示的内容。 API含义setText()设置文本insert(newText)插入文本text()获取文本内容displayText()获取文本显示的内容其中,如果程序设置了密文显示,text()将获取到用户输入的真实值,而displayText()将获取到星号。 程序示例了insert(newText)的使用: from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QLineEdit") w.resize(210,110) le = QLineEdit(w) #创建一个当行文本框 le.setText("一个单行文本框") #设置文本为:一个单行文本框 le.insert(" 123") #在光标处插入:123 print(le.text()) #获取并打印输入文本框 w.show() if __name__ == '__main__': sys.exit(app.exec_())运行: 注:使用 setText("") 或清空函数(详见后文)可以清楚文本框。 2. 显示模式显示模式决定了输入框文本的显示情况,可以是明文,密文,或者是完全不显示等。 相关API: API含义setEchoMode(QLineEdit_EchoMode)设置显示模式echoMode()获取文本框输入模式其参数是一个枚举值 QLineEdit_EchoMode含义Normal普通模式,显示输入的值NoEcho不输出Password密文显示,显示都是星号PasswordEchoOnEdit输入时候显示,结束后密文其中,NoEcho是安全性最高的,无论用户输入什么,都不显示,与密文Password相比,它连位数都是保密的。Unbuntu终端密码就是类似这种想过,初次使用很容易误以为程序不响应。 程序示例输出模式的设置和获取: from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QLineEdit") w.resize(210,110) le0 = QLineEdit(w) le0.setEchoMode(QLineEdit.PasswordEchoOnEdit) #设置显示模式:输入时明文,完毕后密文 le1 = QLineEdit(w) le1.move(0,30) le1.setEchoMode(QLineEdit.Password) #设置显示模式:密文输入 # 打印模式 print(le0.echoMode()) print(le1.echoMode()) w.show() if __name__ == '__main__': sys.exit(app.exec_())运行: 占位提示文本框时在文本框内显示提示文本,但是和显示文本不同,当获取焦点并输入文字以后,占位文本将被取消。 相关API 函数含义setPlaceholderText(notice_str)设置占位文本placeholderText()获取占位文本占位文本示例: from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QLineEdit") w.resize(210,110) le0 = QLineEdit(w) le0.setEchoMode(QLineEdit.PasswordEchoOnEdit) #设置显示模式:输入时明文,完毕后密文 le0.setPlaceholderText("请输入文字") #设置占位文本 print(le0.placeholderText()) #获取占位文本 w.show() if __name__ == '__main__':运行: 单行文本可以通过函数设置清空文本按钮。 函数含义setClearButtonEnabled(bool)使/失能 清空按钮isClearButtonEnabled()查看清空按钮状态示例: from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QLineEdit") w.resize(210,110) le0 = QLineEdit(w) le0.setEchoMode(QLineEdit.PasswordEchoOnEdit) #设置显示模式:输入时明文,完毕后密文 le0.setText("12345") #设置文本 le0.setClearButtonEnabled(True) #使能情况按键 print(le0.isClearButtonEnabled()) #打印按钮状态 print(le0.placeholderText()) #获取占位文本 w.show() if __name__ == '__main__': sys.exit(app.exec_())运行: 文本提前准备了两个图标素材: 添加操作行为可以在单行文本框内添加一个行为,即提供一个按钮,通常这个按钮用来设置文本的显示形式,添加行为使用addAction()方法: from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QLineEdit") w.resize(210,110) le0 = QLineEdit(w) # 添加行为 action = QAction(le0) action.setIcon(QIcon("eye_on")) #设置行为的图标 le0.addAction(action, QLineEdit.TrailingPosition) #在单行文本框尾部添加该行为 print(le0.isClearButtonEnabled()) #打印按钮状态 print(le0.placeholderText()) #获取占位文本 w.show() if __name__ == '__main__': sys.exit(app.exec_())运行: 上文的Aciton只是图标,可通过其信号来triggered添加动作: from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QLineEdit") w.resize(210,110) le0 = QLineEdit(w) # 定义槽函数 def slot(): if le0.echoMode() == QLineEdit.Normal: action.setIcon(QIcon("eye_hidden")) le0.setEchoMode(QLineEdit.PasswordEchoOnEdit) else: action.setIcon(QIcon("eye_on")) le0.setEchoMode(QLineEdit.Normal) # 添加行为 action = QAction(le0) action.setIcon(QIcon("eye_on")) #设置行为的图标 action.triggered.connect(slot) #连接槽函数 le0.addAction(action, QLineEdit.TrailingPosition) #在单行文本框尾部添加该行为 w.show() if __name__ == '__main__': sys.exit(app.exec_())运行: 自动补全指的是如果历史记录有过匹配的账号,将弹出提醒。可以运用于登录框中,用户经常需要输入自己的账号,如果曾经登录过,那么输入第一个字母时,就可以补全账号。程序也可以设置默认的候选对象。默认的候选词通过setCompleter()来设置。 示例: from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QLineEdit") w.resize(210,110) le0 = QLineEdit(w) completer = QCompleter(["Yonas", "Yun", "Luo", "Cat", "Dog", "Water"]) #设置候选词 le0.setCompleter(completer) #添加候选词 w.show() if __name__ == '__main__': sys.exit(app.exec_())运行后输入Y: 输入限制是通过程序来对输入的文本进行限制,如只读,长度,内容类型等。 相关API含义setMaxLength(int)这是最大长度maxLength()获取最长度setReadOnly(bool)设置只读isReadOnly()获取知否只读setValidator(QValidator)设置验证器setInputMask(mask_str)掩码验证hasAcceptableInput()文本是否通过验证 1.设置长度和只读示例: from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QLineEdit") w.resize(210,110) le0 = QLineEdit(w) le0.setText("Read Only") le0.setReadOnly(True) le0.setMaxLength(5) w.show() if __name__ == '__main__':. sys.exit(app.exec_())运行: 可以通过设置验证器(QValidator)来验证文本是否合法,通常,一些网站要求密码有一定的格式,如长度不能过短,需要特殊符号等 。QValidator是一个虚拟的类,不能被直接实例化,需用用户自定义子类方可使用。 以下程序示例了一个验证器的使用,但是它并不是真实的验证器,因为它并没有校验规则: from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QLineEdit") w.resize(210, 110) # 子类化 QValidator class AgeVadidator(QValidator): def validate(self,input_str,pos_int): print(input_str,pos_int) return(QValidator.Acceptable, input_str, pos_int) #返回验证结果 le0 = QLineEdit(w) vadidator = AgeVadidator() #创建验证器 le0.setValidator(vadidator) #添加验证器 w.show() if __name__ == '__main__': sys.exit(app.exec_())运行: 验证器(validate()函数)返回值有3种状态: 状态含义QValidator.Acceptable验证通过,输入的文本给予显示QValidator.Intermediate不确定,输入的文本给予显示QValidator.Invalid验证不通过,输入的文本不显示需要Intermediate中间状态的原因数,有时候无法确定输入的字符是否是有效的,比如我们想要用户输入18-180的值,当用户第一个字符输入“9”时,但是光标位离开编辑框,此时validate()函数就需要返回这值。 fixup()是修复函数,是文本输入完毕后调用的函数,此时程序可以最后判断值是否合理,如果不合理,是显示空字符串(清空)或者是默认设置一个值。注意到:validate()是当文本变化一次,就调用一次,而fixup()是文本输入结束(比如焦点切换到其他输入框中)且本文不符合要求,才调用。 接下来我们对程序进一步补充, 让校验器能对数据进行判断,规定用户只能输入:18-180 的数值 from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QLineEdit") w.resize(210, 110) # 子类化 QValidator class AgeVadidator(QValidator): #定义校验函数 def validate(self,input_str,pos_int): # 判定字符串是否是 数字 try: #捕获异常 if 18 int选中的长度以下程序使能了第一个文本框内文字的拖拽功能: from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QLineEdit") w.resize(200, 100) le0 = QLineEdit(w) le1 = QLineEdit(w) le1.move(0,30) le0.setDragEnabled(True) #使能拖拽功能 w.show() if __name__ == '__main__': sys.exit(app.exec_())运行: 如果使用按钮来编辑文本框,需要注意一种情况:当用户点击按钮的时候,文本框会失去光标。比如,当你设置按钮的功能为[删除选中文字]时候,由于点击按钮时候,会失去焦点,此时文本框会取消选择的文字,接着按钮去删除文字,就会出现非预期的效果。 四、信号 相关信号含义textEdited( text)文本被[用户]编辑时发出信号textChanged(text)文本框文本改变时发出信号returnPressed()用户按下回车时发出信号editingFinished()结束编辑时发出信号cursorPositionChanged(int oldPos,int newPos)光标位置改变时发出信号selectionChanged()选择的文本发送改变时候发出信号textEdited( text) 和 textChanged(text) 不同点是,前者强调了用户编辑,只要文本框被用户编辑,就会发射信号,而后者无论是程序改变还是用户编辑,只要文本发送改变,就会发射信号。 当编辑框失去焦点时,就认为结束的编辑,此时会发射editingFinished()信号。 from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.setWindowTitle("QLineEdit") w.resize(200, 100) le0 = QLineEdit(w) le0.setText("信号测试") le1 = QLineEdit(w) le1.move(0,30) def change_slot(text): print("文本被改变了",text) def edit_slot(text): print("文本被编辑了", text) def finsh_slot(): print("结束编辑了") le0.textChanged.connect(change_slot) le0.textEdited.connect(edit_slot) le0.editingFinished.connect(finsh_slot) w.show()运行: |
CopyRight 2018-2019 实验室设备网 版权所有 |