PyQt5单行文本框控件QLineEdit使用方法大全和信号总结
PyQt5单行文本框控件QLineEdit在实际开发中基本上每个项目都会使用到,而且不止一次的使用,比如注册表,搜索框等等,除此之外对于QLineEdit的使用场景还很丰富,为此PyQt给我们提供了各种QLineEdit使用方法和信号,帮助不同的开发者完成不同的需求。
PyQt5单行文本框控件QLineEdit在实际开发中基本上每个项目都会使用到,而且不止一次的使用,比如注册表,搜索框等等,除此之外对于QLineEdit的使用场景还很丰富,为此PyQt给我们提供了各种QLineEdit使用方法和信号,帮助不同的开发者完成不同的需求。
一、QLineEdit使用方法
QLineEdit使用方法有很多常用的有以下几个方向:
1.构造函数:可以传递上级控件和字符串
class QLineEdit(QWidget): """ QLineEdit(parent: QWidget = None) QLineEdit(str, parent: QWidget = None) """
2.文本的设置和获取:ld是QLineEdit实例化的对象
ld.setText('单行文本编辑器') # 设置文本内容 print(ld.text()) # 获取文本内容 ld.insert('光标在这') # 在光标位置插入文本 print(ld.displayText())
3.输出模式设置方法:在QLineEdit文档最下方给我们枚举了以下四种输出模式
NoEcho = 1 # 不输出 Normal = 0 # 正常输出 Password = 2 # 密文输出 PasswordEchoOnEdit = 3 # 编辑时明文输出
下面代码:
ld = QLineEdit(window) ld.setEchoMode(QLineEdit.PasswordEchoOnEdit)
4.占位提示字符设置方法:占位字符字体颜色或稍微浅一点
ld = QLineEdit(window) ld.setPlaceholderText('默认占位字符') # 设置占位字符 print(ld.placeholderText()) # 获取占位字符
5.清空按钮显示设置:无字符的时候不显示,有占位字符的时候也不显示
ld = QLineEdit(window) ld.setClearButtonEnabled(True) # 设置清空按钮显示 print(ld.isClearButtonEnabled()) # 判断是否有清空按钮
6.自定义操作行为:方法为addAction()
def addAction(self, *__args): # real signature unknown; restored from __doc__ with multiple overloads """ addAction(self, QAction) addAction(self, QAction, QLineEdit.ActionPosition) addAction(self, QIcon, QLineEdit.ActionPosition) -> QAction """ return QAction
先了解以下2个枚举值
QLineEdit.TrailingPosition # 行为显示在文本框后面 QLineEdit.LeadingPosition # 行为显示在文本框前面
通过addAction()返回的action动作来在对应的槽函数中实现自定义操作,后文详细讲解。
act = QAction(ld) act.setIcon(QIcon('123.jpg')) act.triggered.connect(lambda: print('切换动作')) ld.addAction(act, QLineEdit.TrailingPosition) # ld.addAction(act, QLineEdit.LeadingPosition)
7.自动补全设置:通过完成器QCompleter()对象来实现单行文本框自动补全效果。
class QCompleter(__PyQt5_QtCore.QObject): """ QCompleter(parent: QObject = None) QCompleter(QAbstractItemModel, parent: QObject = None) QCompleter(Iterable[str], parent: QObject = None) """
一般使用完成器都使用可迭代对象填充,这样自动补全可选内容比较多。
qc = QCompleter(['sdfhjn', 'iuuhjjhn', 'eurjf', 'eefikj'], ld) ld.setCompleter(qc)
效果如下图,当输入e时出现列表中的后两个待选补全内容使用上下键选中就可以自动补全了。
8.输入限制:输入限制中有内容长度限制、只读方式限制、规则验证等不同限制规则。
内容长度限制:
ld.setMaxLength(10) # 设置输入字符长度为10个以内,包含10个 print(ld.maxLength()) # 获取输入字符长度
只读限制:
ld.setText('单行文本框') ld.setReadOnly(True) # 设置为只读模式,不可编辑,只能选中
规则验证:包含验证器和掩码验证
验证器是用来验证用户输入的合法性,但是用户是按字符输入的,在没有输入完成之前就开始验证就容易返回错误结果,所以验证器给我们提供了三种验证方式:验证通过、验证不通过、验证结果待定。这里使用的是QValidator,QValidator是一个抽象类,再使用之前需要自定义子类或直接使用子类,QValidator对状态的判断有三种处理方法:
QValidator.Acceptable # 验证通过 QValidator.Intermediate # 暂不做出验证判断 QValidator.Invalid # 验证不通过
直接上代码,注意注释内容:
class AgeValidator(QValidator): # QValidator是抽象类,先自定义一个子类 def validate(self, input_str, pos_int): ''' 这里验证数字是不是在18-180之间 QValidator处理方式有三种:Acceptable,Intermediate,Invalid 输入过程中会出现以下5种情况: 验证合法、不合法、没有输入完成暂不验证、没有输入完成删除字符串会出错,光标离开时如果输入不合法依然显示 ''' try: # 防止用户输入不是数字,也可以使用正则进行处理 if 18 <= int(input_str) <= 180: return (QValidator.Acceptable, input_str, pos_int) # 在18-180之间直接验证合法 elif 1 <= int(input_str) <= 17: return (QValidator.Intermediate, input_str, pos_int) # 没有完全输入结束,暂不验证 else: return (QValidator.Invalid, input_str, pos_int) # 验证不合法 except: # 如果不是数字按下面流程处理 if len(input_str) == 0: # 如果输入字符为零,或删除输入字符 return (QValidator.Intermediate, input_str, pos_int) return (QValidator.Invalid, input_str, pos_int) def fixup(self, input_str): # 光标离开时如果输入不合法依然显示,这是需要用fixup方法来修复 '''修复方法的出发是光标或焦点是否离开决定''' try: if int(input_str) < 18: # 如果输入小于18,直接返回18 return '18' return '180' # 如果输入大于180,直接返回180 except: return '18'
PyQt也给我们准备一些现成的子类,但是用起来有点小困扰,不建议使用,主要有以下三种:
QIntValidator # 限制整型数据范围 QDoubleValidator # 浮点型数据限制范围 QRegExpValidator # 正则限制范围
就拿整型数据限制来举例,这里不能自动修正成我们想要的数字,比如输入12后,焦点切换12不会自动变成18,但是我们也可以通过子类化QIntValidator来补充这个功能,只是上面直接写逻辑更能自由发挥,这类不贴代码了,大家自己看文档。
掩码验证:使用方法setInputMask(),掩码验证顾名思义就想IP的配置时要配置子网掩码一样,在固定位置上要正确的输入内容,比如电话区号+号码,软件序列号都会用到此功能。这里主要注意setInputMask()接收的参数和格式。
参考上面的掩码字符来完成这个方法使用
led.setInputMask('>AAAA-9A') led.setInputMask('9999-9999999') # 固话号码
9.是否被编辑设置:通过setModified()方法来设置,通过isModified获取。
led.setModified(False) print(led.isModified())
10.光标控制:在这里还是比较重要的,光标控制方法有不少:
# 向左移动 led.cursorBackward(True, 2) # True带选中效果,选中2个字符 # led.cursorBackward(False, 2) # False不带选中效果 # 向右移动 led.cursorForward(True, 2) # True带选中效果,选中2个字符 # led.cursorForward(False, 2) # False不带选中效果 # 向左移动一个单词长度 led.cursorWordBackward(True) # True带选中效果 led.cursorWordForward(False) # False不带选中效果 # 向右移动一个单词长度 led.cursorWordBackward(True) # True带选中效果 led.cursorWordForward(False) # False不带选中效果 # 移动到行首 led.home(True) # True带选中效果 led.home(False) # False不带选中效果 # 移动到行尾 led.end(True) # True带选中效果 led.end(False) # False不带选中效果 # 设置光标位置 led.setCursorPosition(2) # 设置光标位置在第二个字符后 print(led.cursorPosition()) # 获取光标位置
11.文本边距设置方法
led.setTextMargins(20, 2, 2, 2)
这里方法中的4个数字分别设置了左、上、右、下的边距
12.常见编辑方法:
退格【backspace()】、删除【del_()】、清空【clear()】、复制【copy()】、剪切【cut()】、粘贴【paste()】、撤销【undo()】、重做【redo()】、拖放【setDragEnabled(bool)】、文本选中。这些都比较简单不演示了,这里要讲一下文本选中的一些方法:
led.setSelection() # 选中指定区间文本 led.selectAll() # 选中所有文本 led.deselect() # 取消选中的文本 led.hasSelectedText() # 是否选中文本 led.selectedText() # 获取选中文本 led.selectionStart() # 选中文本的开始位置 led.selectionEnd() # 选中文本的结束位置 led.selectionLength() # 选中文本的长度
13.文本对齐方式设置:主要使用枚举值来设置对齐方式
led.setAlignment(Qt.AlignLeft) # 水平左对齐 led.setAlignment(Qt.AlignRight) # 水平右对齐 led.setAlignment(Qt.AlignHCenter) # 水平横向居中对齐 led.setAlignment(Qt.AlignJustify) # 相当于左对齐 led.setAlignment(Qt.AlignTop) # 垂直向上对齐 led.setAlignment(Qt.AlignBottom) # 垂直向下对齐 led.setAlignment(Qt.AlignVCenter) # 垂直居中对齐 led.setAlignment(Qt.AlignBaseline) # 垂直基线对齐 led.setAlignment(Qt.AlignCenter) # 水平和垂直都居中
二、QLineEdit常用信号
led.textEdited() # 文本编辑时发射该信号 led.textChanged() # 文本框改变时发射该信号 led.returnPressed() # 按下回车键时发射该信号 led.editingFinished() # 结束文本编辑时发射该信号 led.cursorPositionChanged() # 光标位置发生改变时发射该信号 led.selectionChanged() # 选中的文本发生改变时发射该信号