Pyside6 键盘输入控件---单行文本框QLineEdit

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, actionposition)

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())

运行结果:

20241008-222522

对于QValidator的便利子类,都比较简单,创建方法如下:

API函数

参数说明

返回值

功能作用

QIntValidator(bottom,top,parent)

bottom:int

top:int

parent:QWidget

None

创建一个整型验证器类

QDoubleValidator(bottom,top,decimalsparent)

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的时候才会触发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值