1.QLineEdit的介绍(官翻)
单行文本编辑器允许用户输入和编辑单行纯文本,具有一些实用的编辑功能,包括撤销和重做,剪切和粘贴,以及拖放。
通过修改行编辑器的echomde(),它还可以用作只写字段,用于输入密码等信息。
QTextEdit是一个与之相关的类,它允许多行、富文本编辑。
使用maxLength属性定义文本的最大允许长度。可以使用inputMask属性和setValidator()进一步约束文本内容。
可以用setText()或insert()来修改文本。使用text()来取得文本,使用displayText()来取得显示的文本(可能不同,请参见echomde)。可以使用setSelection()或selectAll()来选择文本,还可以使用cut()、copy()和paste()来剪切所选文本。要对齐文本,请使用setAlignment()。
当文本发生变化时,就会触发textChanged()信号。如果不是通过调用setText(),而是通过其他方式改变了文本,就会触发textEdited()信号。当移动游标时,会触发cursorPositionChanged()信号。当选择了Return或Enter键时,就会发出returnPressed()信号。
当文本编辑完成时,无论是因为行编辑失去焦点,还是选择了Return/Enter,都会发出editingFinished()信号。
如果行编辑焦点丢失而没有任何文本更改,则不会发出editingFinished()信号。
如果在edit行上设置了验证器,则只有在验证器返回QValidator.accept时才会发出returnPressed() / editingFinished()信号。
有关使用QLineEdit的多种方式的更多信息,请参阅行编辑示例,它还提供了一些行编辑示例,这些示例显示了各种属性和验证器对用户提供的输入和输出的影响。
默认情况下,QLineEdits具有平台样式指南中指定的框架。调用setFrame (false)可以取消框架。
默认键盘键位绑定:
键位 | 动作 |
<--(键盘方向键左键) | 光标左移一个字符 |
shift + <-- | 光标向左移动并选择一个字符。 |
--> | 光标左移一个字符 |
shift + --> | 光标向左移动并选择一个字符。 |
Home | 光标移至行首 |
End | 光标移至行尾 |
Backspace | 删除光标左侧字符 |
Ctrl + Backspace | 删除光标左侧单词 |
Delete | 删除光标右侧字符 |
Ctrl+Delete | 删除光标右侧单词 |
Ctrl+A | 全选 |
Ctrl+C | 复制 |
Ctrl+Insert | 复制 |
Ctrl+K | 当前光标位置删除至行位 |
Ctrl+V | 粘贴 |
Shift+Insert | 粘贴 |
Ctrl+X | 剪切 |
Shift+Delete | 剪切 |
Ctrl+Z | 撤销 |
Ctrl+Y | 重做 |
2.QLineEdit的相关方法
API函数 | 参数说明 | 返回值 | 功能作用 |
QLineEdit(self, parent) | parent: QWidget | None | 创建一个单行文本框 |
QLineEdit(self, arg__1, parent) | arg__1: str parent:QWidget | None | 创建一个单行文本框 |
addAction(self, action,position) | action:QAction postion: QLineEdit.ActionPosition | None | 在指定位置添加动作按钮 |
addAction(self, icon,position) | icon:QIcon postion: QLineEdit.ActionPosition | QAction | 在指定位置添加动作按钮 |
setAlignment(self, flag) | flag: Qt.AlignmentFlag | None | 设置文本框文字对齐方式 |
alignment(self) | None | Qt.AlignmentFlag | 设置文本框文字对齐方式 |
backspace(self) | None | None | 删除光标左侧或选中文字 |
clear(self) | None | None | 清空文本框 |
setCompleter(self, completer) | completer: QCompleter | None | 设置自动补全器 |
completer(self) | None | QCompleter | 获取自动补全器 |
copy(self) | None | None | 复制选中文字 |
cut(self) | None | None | 剪切选中文字 |
paste(self) | None | None | 粘贴选中文字 |
createStandardContextMenu(self) | None | QMenu | 该函数创建标准上下文菜单,当用户用鼠标右键单击行编辑时显示该菜单。 |
cursorBackward(self, mark, steps=1) | mark: bool, steps: int = 1 | None | 将光标向后移动step个字符。 |
cursorForward(self, mark, steps=1) | mark: bool, steps: int = 1 | None | 将光标向前移动step个字符。 |
cursorWordBackward(self, mark) | mark:bool | None | 将光标向后移动一个单词 |
cursorWordForward(self, mark) | mark: bool, | None | 将光标向前移动一个单词 |
home(self, mark) | mark: bool, | None | 将光标移动到行首 |
end(self, mark) | mark: bool, | None | 将光标移动到行尾 |
setCursorMoveStyle(self, style) | style: Qt.CursorMoveStyle | None | 设置光标移动样式 |
cursorMoveStyle(self) | None | style: Qt.CursorMoveStyle | 获取光标移动样式 |
setCursorPosition(self, arg__1) | arg__1: int | None | 设置光标的当前位置. |
cursorPosition(self) | None | int | 获取光标的当前位置,默认为0 |
cursorPositionAt(self,pos) | pos:QPoint | int | 获取光标相对于给定坐标点的位置。 |
cursorRect(self) | None | QRect | 返回包含光标一圈的矩形尺寸 |
deselect(self) | None | None | 取消选择已选中的任何文本 |
displayText(self) | None | str | 获取显示的文本 |
setDragEnabled(self, b) | b:bool | None | 设置被选中文本是否可以拖动 |
dragEnabled(self) | None | bool | 获取被选中文本是否可以拖动,默认情况下是False |
setEchoMode(self, arg__1) | arg__1: QLineEdit.EchoMode | None | 设置掩码显示模式 |
echoMode(self) | None | QLineEdit.EchoMode | 获取掩码显示模式 |
hasAcceptableInput(self) | None | bool | 获取是否满足掩码和验证其的要求 |
setInputMask(self, inputMask) | inputMask:str | None | 设置固定输入格式 |
inputMask(self) | None | str | 获取固定输入格式 |
setValidator(self, arg__1) | arg__1: QValidator | None | 设置验证器 |
validator(self) | None | QValidator | 获取验证器 |
setFrame(self, arg__1) | arg__1: bool | None | 设置是否拥有框架外观标识 |
hasFrame(self) | None | bool | 获取是否拥有框架外观标识 |
hasSelectedText(self) | None | bool | 返回是否有选中的文本 |
inputMethodQuery(self, arg__1) | arg__1: Qt.InputMethodQuery | any | 设置输入法的查询 |
insert(self, arg__1) | arg__1: str | None | 在光标位置插入字符串,字符串需满足验证结果 |
setClearButtonEnabled(self, enable) | enable: bool | None | 设置是否加载清空按钮 |
isClearButtonEnabled(self) | None | bool | 获取是否设置清空按钮 |
isModified(self) | None | bool | 获取文本内容是否被修改 |
setModified(self, arg__1) | arg__1: bool | None | 函数方法强制修改文本修改属性的值(True或False) |
setReadOnly(self, arg__1) | arg__1: bool | None | 设置文本是否只读 |
isReadOnly(self) | None | bool | 获取文本是否只读 |
redo(self) | None | None | 重做 |
isRedoAvailable(self) | None | bool | 获取是否可以重做,默认为False |
undo(self) | None | None | 撤销 |
isUndoAvailable(self) | None | bool | 获取是否可以撤销,默认为False |
setMaxLength(self, arg__1) | arg__1: int | None | 设置文本的最大长度 |
maxLength(self) | None | int | 获取文本的最大长度,默认为32767 |
setPlaceholderText(self, arg__1) | str | None | 设置占位文字 |
placeholderText(self) | None | str | 获取占位文字 |
selectAll(self) | None | None | 选中所有文本(高亮显示) |
selectedText(self) | None | str | 获取被选中的文本 |
selectionStart(self) | None | int | 获取选中文字的开始字符索引,未选中任何文字返回-1 |
selectionEnd(self) | None | int | 获取选中文字的末尾字符索引 |
selectionLenth(self) | None | int | 获取选中文字的长度 |
setSelection(self, arg__1, arg__2) | arg__1: int, arg__2: int | None | 从光标开始位置选中指定长度的文字 参数1是光标位置,参数2是选中文本长度 |
setText(self, text) | text:str | None | 函数方式向文本框中输入文本 |
text(self) | None | str | 获取文本框中的文本 |
setTextMargins(self, left, top, right, bottom) | left: int, top: int, right: int, bottom: int | None | 设置文本边距 |
textMargins(self) | None | QMargins | 获取文本边距 |
sizeHint(self) | None | QSize | 返回文本框的建议尺寸 |
minimumSizeHint(self) | None | QSize | 返回文本框的最小尺寸 |
1)QLineEdit的文本内容的设置
QLineEdit继承自QWidget。
单行文本框允许用户使用键盘进行编辑,输入内容。通常用作账户、密码、个人信息等简短信息的采集。与之对应的还有多行文本编辑器QTextEdit,QTextEdit通常作为大型文档的界面使用,如wps等。
默认情况下,单行文本框是允许用户编辑的,但可以通过setReadOnly()方法进行启用或者禁用编辑功能。
QLineEdit的键盘输入默认绑定了一些键位用于特定的操作,如常用的复制、粘贴等。具体键位与对应的操作前面介绍中已经列出。这些键盘操作,对于编程人员Pyside6也给出相应的函数调用,如copy()、paste()、redo()、undo()等等。
编程人员的函数输入方式通常采用setText()方法,输入内容只能是纯文本(即富文本,markDown格式文本都无法显示效果)。
setText()方法输入文本会覆盖原有文本框中所有的文本内容,如果仅仅需要插入一段文字,函数方法可以使用insert()方法,insert()方法需要配合光标位置操作,才能将需要插入的文字放置在预想的位置。比如我想在“我爱祖国”中插入“我的”这两个字符,变为“我爱我的祖国”,就需要将光标移到“我爱”之后,再调用insert()方法。
既然说了QLineEdit是对简短信息的采集,如用户名和密码,那么采集完这些数据后大多数情况下会发送至数据库。数据库为方便字段管理和安全通常会限制字段长度。那么字段采集框QLineEdit当然也要做相应的限制。具体内容的限制,如大小写,符号等需要通过验证器(后面学习),而字段长度就需要使用setMaxLength( )方法来限制。
获取文本框中的内容使用text()方法与displayText( )这两个方法,这两个方法的区别在于掩码的设置:text()方法会显示实际输入内容,而displayText()方法则可能仅仅显示“......”的掩码(具体见后面掩码小节)。
2)QLineEdit的文本光标操作
所谓的光标QTextCursor,就是编辑框中一闪一闪的指示符,它在QLineEdit中是无法获取的,而在QTextEdit中是可以获取并进行操作的。
虽然无法直接获取QTextCursor对象进行操作,但是QLineEdit为我们提供操作光标的相关方法。如,刚才说的要在“我爱祖国”中插入“我的”两个字符,可以采用下列几个流程:
第一种:先使用home()或者end()方法将光标移动到行首或者行尾,再调用cursorForward(self, mark, steps=1)或者cursorBackward(self, mark, steps=1)方法将光标移动至position = 2的位置,然后再调用insert()方法。
cursorForward(self, mark, steps=1)和cursorBackward(self, mark, steps=1)这两个函数的用法是将光标前或者向后移动setps个位置,默认为1。当我们设置为steps=2的时候,调用一次函数就会移动两个位置,比如光标目前在行首,位置为0,调用cursorForward()后,就会将光标移动到2。
当然,如果文本框中没有内容,是无效的。mask参数,如果是True,光标移动时会附带选中文本内容,Flase,则不会选中。比如:目前文本框内容为“我爱祖国”,光标位置为4,即在“国”之后。调用cursorBackward(self, True, steps=2),光标将会移动到“爱”之后,同时,“祖国”两个字会被选中。
第二种:使用cursorPosition( )方法,获取当前光标的位置,在调用cursorForward( )或者cursorBackward( )方法将光标移动到相应位置。如““我爱祖国”字符,此时光标位置为1,即在“我”之后。调用cursorForward( )方法,steps = 1,将光标移动到“爱”之后,在insert()方法。
第三种:最简单直接的,setCursorPosition()。无论光标现在的位置在哪里,直接将光标位置设置到需要的位置。
在文本光标的设置中,cursorMoveStyle( )是用来设置键盘左右方向键对光标影响的方法,其参数是一个枚举了:
枚举类 | 枚举常量 | 枚举值 | 功能描述 |
Qt.CursorMoveStyle | LogicalMoveStyle | 在从左向右的文本块内,按左箭头键时减少光标位置,按右箭头键时增加光标位置。如果文本块是从右到左,则行为相反。 | |
VisualMoveStyle | 不管文本块是从左至右还是从右至左,左箭头都减少光标位置,右箭头都是增加光标位置。 |
这个方法是针对用户在使用键盘“<--”和“--->”时的设置。
首先我们要明确什么是从左到右的文本块和从右到左的文本块。这是与各个国家与地区的书写习惯相关的,书写习惯就定义了计算机中的书写系统。
现代汉字的书写系统是从左至右的,而古代的汉语就是从右至左,现代的阿拉伯语、维吾尔语都是从右至左的书写系统。所以,LogicalMoveStyle类型就是遇到从右至左的书写系统,左右箭头的作用就会相反。但是,通常情况下,光标配合键盘还是VisualMoveStyle类型设置好一些。
cursorPositionAt(self,pos)与cursorRect(self)基本用不到,因为你无法获取QTextCursor对象,所以没啥意义。
3)QLineEdit的选中操作
选中操作实际也是通过操作光标来完成的,从上一小节中的cursorForward( )和cursorBackward( )
方法,我们也能看出大概。
光标选中的原理,实际如下:首先在光标当前位置设置锚点,然后移动光标,那么锚点与光标的最终位置之间就是选中的内容(这个到学习QTextEdit时就能理解)。
通常,用户操作的选中是通过鼠标按住左键移动进行的,而编程人员通过函数选中内容的话,需要使用setSelection()方法。
setSelection()方法有两个参数,第一个参数是光标位置,第二个参数是选中字符长度。如QLineEdit中的内容是:“我爱我的祖国”,setSelection(1,4)的结果就是“爱我的祖”。
这里虽然我们为了说明问题给出了选中的结果,但是实际上setSelection()是不会返回结果的,它只会标识选中的内容(蓝色高亮)。
而想要获取选中的结果,就需要使用selectedText( )。我们也可以通过selectionStart( )。selectionEnd()、selectionLenth()分别获取选中字体的首字符、尾字符和字符长度。
有时,我们需要对选中的文字进行操作。如果没有选中的文字,那么selectedText( )返回值是空字符串,下面的代码如果是对空字符串进行操作就会报错,如正则表达式匹配。所以,在必须确保有选中文本内容时,方法就派上了用场,只要“if hasSelectedText( ):”就Ok了。
4)QLineEdit的掩码设置和浮显设置
所谓的掩码,就是输入时掩人耳目的显示字符。大多数登录界面的密码栏或需要输入密码的位置,基于安全考虑,软件设计者都会将你输入的密码变为“*********”这种样式,这就是掩码设置。
QLineEdit通过setEchoMode()方法进行掩码设置,它的参数是一个枚举类:
枚举类 | 枚举常量 | 枚举值 | 功能描述 |
QLineEdit.EchoMode | Normal | 在输入时显示字符。这是默认设置 | |
NoEcho | 不要显示任何内容。对于连密码长度都需要保密的密码,这种方式可能比较合适。 | ||
Password | 显示密码的掩码字符,而不是实际字符。可能是“• ”,有的系统可能是“*” | ||
PasswordEchoOnEdit | 输入的时候显示正常字符,失去焦点变掩码字符 |
与掩码设置配套使用的是addAction()方法,其参数position是一个枚举类:
枚举类 | 枚举常量 | 枚举值 | 功能描述 |
QLineEdit.ActionPosition | LeadingPosition | action放在前面 | |
TrailingPositio | action 放在后面 |
这个方法的作用是为单行文本框添加一个action,作用是什么呢,见下图:
我们登陆或者注册的时候,填写密码如果设置掩码自己也是看不到的,那么点击这个眼睛就可以看到密码的内容了。这种场景的具体实现方法如下:
首先将文本框掩码类型设置为Password,即setEchoMode(QLineEdit.EchoMode.Password)。然后创建一个QAction对象,将QAction对象的icon设置为闭眼的图片。再将QAction对象triggered信号链接到槽函数。
槽函数中进行判断,如果当前icon是闭眼图片就改为睁眼图片,同时将掩码模式设置为Normal,否则icon为睁眼模式,并将掩码模式改为Password。
方法setClearButtonEnabled( )则是为文本框添加一个清空按钮,点击后效果等同于调用clear()。
setPlaceholderText()用于设置浮现文字。而所谓的浮显设置,就是用于提示用户输入内容和注意事项的底纹字符,如下图:
5)QLineEdit的格式文字输入
有的时候我们需要输入固定格式的文本,如IP地址,日期等,就可以用setInputMask()方法来设置这种固定的文本格式。例如setInputMask(“000.000.000.000”)可以用来设置IP地址,而设置日期就可以写作setInputMask("HHHH.HH.HH HH:HH:HH”).
当然,其中的字符是有规定的,具体规定如下格式化输入字符表:
字符 | 含义 |
A | ASCII字母是必须的,取值A-Z,a-z |
a | ASCII字母是允许的,但不是必须的 |
N | ASCII字母和数字是必须的,取值A-Z,a-z,0-9 |
n | ASCII字母和数字是允许的,但不是必须的 |
X | 任何字符都是必须的 |
x | 任何字符都是允许的,但不是必须的 |
9 | ASCII数字是必须的,取值0-9 |
0 | ASCII数字是允许的,但不是必须的 |
D | ASCII数字是必须的,取值1-9 |
d | ASCII数字是允许的,但不是必须的,取值1-9 |
# | ASCII数字和加/减号是允许的,但不是必须的 |
H | 十六进制字符是必须的,取值范围A-F,a-f,0-9 |
h | 十六进制字符是允许的,但不是必须的 |
B | 二进制字符是必须的,取值范围0、1 |
b | 二进制字符是允许的,但不是必须的 |
> | 所有字符字母都大写 |
< | 所有字符字母都小写 |
! | 关闭大小写转换 |
\ | 转义字符 |
;c | 终止输入掩码,并把空余输入设置成c |
如我们设置setInputMask("HHHH.HH.HH HH:HH:HH”),效果如下:
输入内容前:
输入内容后:
6)QLineEdit的自动补全器
setCompleter()方法是为单行文本框设置一个自动补全器,其参数是补全器对象QCompleter。所谓的自动补全,即开发人员提前设计,用户在输入的时候可以得到联想词组。QCompleter还可以用于QComboBox及QFileSystemModel中,QCompleter类的具体使用由于牵扯较多模型/视图的内容,我们将在后面模型/视图章节具体介绍,这里只介绍简单的列表设置方式。
API函数 | 参数说明 | 返回值 | 功能作用 |
QCompleter(self, completions, parent) | completions: Sequence[str] parent:QObject | None | 创建一个完成器对象 |
如上图:我们可以使用如下代码设置和添加完成器:
comp = QCompleter(["中国","中央","中产阶级"],self)
le = QLineEdit(self)
le.setCompleter(comp)
7)QLineEdit的右键菜单
在QMenu中我们已经介绍了QWidget及其子类的右键菜单的创建方法,这里就不多做赘述。此处主要是介绍QLineEdit的createStandardContextMenu(self)方法,它是为文本框创建一个Pyside6标准的右键菜单,同时它的将被创建的菜单作为返回值返回。但这个右键菜单不是很完整,我们可以利用其返回值的QMenu进行修改完善后再设置给文本框。
实际上,当我们创建QLineEdit()对象后,它已经包含了一个标准的右键菜单。如图:
但是,如果我们相对其进行修改,是办不到的,因我们无法获取到QMenu对象。而createStandardContextMenu(self)则是创建一个菜单并同时将QMenu对象返回,我们可以打印下这个QMenu的actions,和默认的是一摸一样的,这就为我们修改QMenu提供了便利。
8)QLineEdit的拖放操作
对于控件的拖拽与放置通常是通过其QDragMoveEvent和QDropEvent来进行的。但QLineEdit提供了方便的函数setDragEnabled()用于开启文本框是否开启选中文本的移动,而文本文本框是否接受其他控件中移动过来的内容可以通过继承自QWidget的setAcceptDrops()方法来设置。默认情况下QLineEdit是接受放置而不能将选中文本拖动的。
9)QLineEdit的验证器
当我们在设计单行文本框作为用户名或密码输入框时,想要限制用户的输入,比如要求用户输入的密码不能超过18位,是大小写字母和数字的组合等等。此时,我们可以通过text()方法获取用户输入的文本通过正则表达式进行判定,但是这样就必须设置一个按钮,让用户确认完成输入。QLineEdit为我们提供了一个动态的验证方法,就是使用setValidator()。它的参数QValidator是一个抽象类无法直接使用,Qt为我们提供了三个可以直接使用的便利子类:QIntValidator,QDoubleValidator,QRegExpValidator。
QIntValidator,QDoubleValidator分别用来设置合法整数和合法浮点数,而QRegExpValidator用来结合正则表达式来判断输入的合法性。我们也可以子类化QValidator,来自己定义一个符合要求的验证器。而自定义验证器就需要创建QValidator()对象以及实现他的validate()和fixup()方法。
API函数 | 参数说明 | 返回值 | 功能作用 |
QValidator(parent) | parent:QWidget | None | 创建一个验证器类 |
validate(self, arg__1, arg__2) | arg__1: str arg__2: int | tuple(state,str,int) | 验证器的验证函数,返回值为验证是否通过 |
fixup(self, arg__1) | arg__1: str | str | 对QValidator.Invalid的数据给予一次修正的提示,返回值默认为空字符串。 |
自定义子类验证器的步骤如下:
第一步:重写validate(),他的形参是一个字符串和一个int类型,分别代表当前已输入的字符和光标位置,而不是输入结束(失去焦点或Enter)。而方法的返回值就是一个对验证结果的反馈标识,其是一个包含验证结果,字符串和int的一个元组,样式为(QValidator.State,p_str,p_int)这个字符串和int我们不用设置数据,因为它是直接接受函数的形参再返回的。而QValidator.State是一个枚举类,如下:
枚举类 | 枚举常量 | 枚举值 | 功能描述 |
QValidator.State | Invalid | 验证结果为无效 | |
Intermediate | 验证结果为中间态 | ||
Acceptable | 验证结果有效 |
这几个枚举值需要举例进行解释:比如我们的验证器要求值在10-100之间,那么输入的值在10-100之间的返回状态就是Acceptable,如果小于10或者大于100就是Invalid。而在我们实际输入的过程中,我们要输入25,当然是先输入“2”在输入“5”。那么当我们输入2的时候,2<10,那么验证器就会返回状态Invalid,这样显然不合理。那么我们就将2设置为一个中间态Intermediate,含义就是暂时认为你合格,输入过程不作处理,等输入结束(失去焦点或Enter)再做判断。需要说明的如果返回结果是Invalid,输入的字符不会显示。
这里需要理解的是,我们每输入一个字符、删除字符或者粘贴等改变内容,QValidator都会调用validate(),当然输入结束也会调用validate()方法。
第二步 实现fixup()方法,此方法不是必须实现的,看个人需要。它的目的在于对中间态的验证Intermediate结果进行一次处理,也可以不处理(具体需要)。但是有的情况是必须处理的,比如上面我们提到的例子,当我们输入2的时候就结束编辑,那么此时validate()的状态就是中间态Intermediate,而且文本框中又被显示出来,这显然也是不符合我们的需求的,此时程序会自动调用fixup()方法。在fixup()方法中我们可以弹框提示错误,也可以将文本框内容清空,亦或者强制重新输入(焦点返回文本框,继续输入)。fixup()执行完毕后又会再次自动调用validate()方法,并将其返回值发送给validate()方法方法的p_str参数,所以fixup()的要求是一个字符串。需要说明的整个过程中fixup()方法只会执行一次,也就是说其返回值发送给validate()后,如果发送的字符串的验证结果还是中间态Intermediate,最终程序也就会结束,不会再一次去调用fixup()方法(如果允许再调用就成了无限循环了)。
我们看下面的例子:
from PySide6.QtWidgets import QWidget, QApplication, QLineEdit, QErrorMessage
from PySide6.QtGui import QValidator
import sys
class MyValidator(QValidator):
def validate(self, p_str, p_int):
"""
对接收的数据进行判定,当文本框不为空且p_str是数字字符串的时候,数值在10-100
之间时,返回Acceptable;数值在1-10之间时为Intermediate,否则为Invalid,
即大于零。
而当文本框为空时,返回中间状态。
"""
if len(p_str) != 0 and p_str.isdigit():
if 10 <= int(p_str) <= 100:
return (QValidator.State.Acceptable, p_str, p_int)
elif 1 <= int(p_str) < 10:
return (QValidator.State.Intermediate, p_str, p_int)
else:
return (QValidator.State.Invalid, p_str, p_int)
elif len(p_str) == 0:
return (QValidator.State.Intermediate, p_str, p_int)
else:
# 弹出错误对话框提示错误
if p_str == "输入错误":
QErrorMessage(self.parent()).showMessage("请输入10-100之间的数!")
return (QValidator.State.Invalid, p_str, p_int)
def fixup(self, p_str):
"""
从 validate()得到,中间状态有两种,一种文本框为空,另一种为
数值在1-10之间。那么,当小于文本框为空时,不做处理。当数值在1-10
之间是,返回字符串“输入错误”给validate()。validate()接收到
“输入错误”字符串后弹出错误对话框,而后结束。
"""
if len(p_str) != 0:
return "输入错误"
class MyWindow(QWidget):
def __init__(self):
super(MyWindow, self).__init__()
self.resize(600, 500)
le = QLineEdit(self)
le.move(100, 100)
le1 = QLineEdit(self)
le1.move(100, 200)
valiator = MyValidator(le)
le.setValidator(valiator)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec())
运行结果:
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="XYqemMTY-1728399012118" src="https://live.csdn.net/v/embed/428378"></iframe>20241008-222522
对于QValidator的便利子类,都比较简单,创建方法如下:
API函数 | 参数说明 | 返回值 | 功能作用 |
QIntValidator(bottom,top,parent) | bottom:int top:int parent:QWidget | None | 创建一个整型验证器类 |
QDoubleValidator(bottom,top,decimals,parent) | bottom:int top:int decimals:int parent:QWidget | None | 创建一个浮点型验证器类 |
QRegularExpressionValidator(self, re,parent) | re: Union[QRegularExpression, str] parent:QWidget | None | 创建一个正则表达式验证器类 |
整型验证器QIntValidator(bottom,top,parent),其参数bottom和top分别为最小值和最大值。好比前面10-100的例子,10就是bottom,100就top。需要说明的是,默认情况下,QIntValidator的最大值做了限制,即大于top将是Invalid。但是,对于最小值没有优化,当值小于bottom,完成输入时,不会提示或报错。如果要使用,可以自己继承QIntValidator,然后在fixup()方法中自己优化。
浮点型验证器QDoubleValidator(bottom,top,decimals,parent)中,其他参数含义与QIntValidator一致,而decimals参数表示小数点位数。这个方法Qt内部基本没有实现,完全无效。同理,如果想使用,就必须自己内部进行参数设置以及validate()和fixup()的实现。
QRegularExpressionValidator的参数QRegularExpression是一个正则表达式类(关于正则表达式请参看python的基础教程)。对于邮箱、网址等的验证非常方便。
QLineEdit的相关重要的方法已经介绍完毕,其他诸如文本对齐之类方法就很简单,不再过多说明。
3.QLineEdit的信号
信号 | 参数说明 | 返回值 | 功能作用 |
cursorPositionChanged(oldpos, newpos) | oldpos:int newpos:int | 光标位置发生变化时发送信号,参数分别为光标的原位置和新位置 | |
editingFinished() | None | 按Enter或失去焦点时发送信号 | |
inputRejected() | None | 拒绝输入时发送信号 | |
returnPressed() | None | 按Enter时发送信号 | |
selectionChanged() | None | 选中文本改变时发送信号 | |
textEdited(text) | text:str | 文本被编辑是发送信号,setText()方法不会发送信号 | |
textChanged(text) | text:str | 文本发生改变时发送信号,setText()方法会发送信号 |
这几个信号里面需要说明的是:
在没有设置验证器的情况下,inputRejected信号不会被触发,editingFinished在失去焦点和Enter的时候都会触发,returnPressed在Enter时会被触发。
在设置验证器的情况下,editingFinished和returnPressed都只在输入内容为Accetpable的情况下Enter才会触发,失去焦点不会被触发。inputRejected在输入内容为Invalid的时候才会触发。
标签:__,控件,None,self,文本框,---,QLineEdit,文本,光标 From: https://blog.csdn.net/love_songming/article/details/142743181