PyQt5 是一个强大的Python库,用于创建图形用户界面(GUI)。其中,QLineEdit 控件作为一个简单而实用的组件,经常用于接受用户的单行文本输入,甚至可以用来进行输入格式的限制。这篇博客中将介绍 QLineEdit 控件的各种功能和用法,帮助您更好地利用这个神奇的控件。
什么是QLineEdit控件?
QLineEdit是PyQt5中的一个基本控件,主要用于接受用户的单行文本输入。除了基本的文本输入功能外,它还支持一些附加功能,包括回显模式、输入限制和验证、信号与槽机制等。
创建第一个QLineEdit控件
让我们从一个简单的例子开始,创建一个基本的 QLineEdit 控件:
import sys
from PyQt5.QtWidgets import QLineEdit, QWidget,QApplication
app = QApplication(sys.argv)
w=QWidget()
w.setGeometry(300,300,300,300)
lineEdit = QLineEdit(w)
lineEdit.setPlaceholderText('请输入')
w.show()
sys.exit(app.exec_())
在窗口中创建QLineEdit控件的方式主要有两种,第一种是直接将QLineEdit作为窗口的子部件lineEdit = QLineEdit(w)
;第二种是使用布局管理器,先将QLineEdit控件添加到布局中,然后将布局添加给窗口。
#创建窗口
window = QWidget()
# 创建QLineEdit
lineEdit = QLineEdit()
lineEdit.setPlaceholderText('请输入')
# 创建布局管理器并将QLabel添加到布局中
layout = QVBoxLayout(window)
layout.addWidget(lineEdit)
- 程序预览
QLineEdit的功能
文本输入和文本编辑
通过下面的程序可以直观的了解此功能,该程序创建了一个窗口,包含一个QLabel和一个QLineEdit。当用户在QLineEdit中输入或编辑文本时,QLabel会实时更新显示QLineEdit的文本内容。对QLineEdit控件进行编辑时会触发textChanged
信号。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QLineEdit
class TextInputExample(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('文本输入示例')
layout = QVBoxLayout()
# 创建一个QLabel用于显示QLineEdit的文本内容
self.label = QLabel('QLineEdit文本内容:')
layout.addWidget(self.label)
# 创建一个QLineEdit用于文本输入和编辑
self.line_edit = QLineEdit()
self.line_edit.textChanged.connect(self.onTextChanged) # 连接文本改变信号到槽函数
layout.addWidget(self.line_edit)
self.setLayout(layout)
# 文本改变时更新QLabel的文本内容
def onTextChanged(self, text):
self.label.setText('QLineEdit文本内容:' + text)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = TextInputExample()
window.show()
sys.exit(app.exec_())
回显模式
在 PyQt 中,QLineEdit
控件的回显模式(EchoMode)用于控制用户在输入文本时显示内容的方式。通过设置不同的回显模式,可以实现不同的效果以适用于不同场景,例如密码输入等敏感信息的保护。 QLineEdit
的回显模式有以下四种:
-
Normal:
- 这是默认的回显模式,输入的内容会直接显示出来,即用户看到的是他们正在键入的文字。
-
NoEcho:
- 在这种模式下,用户输入的内容不会被显示出来。这意味着用户在输入框中看不到任何字符,使用过linux系统的用户应该有感受。
-
Password:
- 密码模式,将用户输入的所有字符替换为星号(*)或其他约定符号。
-
PasswordEchoOnEdit:
- 当用户正在编辑(输入或删除字符)时会短暂地显示输入的字符,一旦输入框失去焦点后,已输入的内容会被隐藏(如显示为星号),提供一种既让用户能够确认刚刚输入的字符是否正确,又能及时隐藏敏感信息的功能。
通过调用 setEchoMode()
方法更改 QLineEdit
的回显模式,并传入相应的枚举值
- 程序预览
输入限制和验证
验证器
有些时候需要对用户的输入进行限制,就可以使用验证器进行限制,在pyqt5中内置了一些验证器QIntValidator
,QDoubleValidator
和QRegExpValidator
QIntValidator
: 限制输入为整数,并可以设置最小值和最大值。QDoubleValidator
: 类似于QIntValidator
,但用于验证浮点数。QRegExpValidator
: 使用正则表达式进行更复杂的验证。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QFormLayout, QLabel, QLineEdit
from PyQt5.QtGui import QIntValidator,QDoubleValidator,QRegExpValidator,QValidator
from PyQt5.QtCore import QRegExp
class ValidatorDemo(QWidget):
def __init__(self):
super(ValidatorDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('验证器')
#lineEdit
intlineEdit=QLineEdit()
doubleEdit=QLineEdit()
regexpEdit=QLineEdit()
#validator
intValidator=MyIntValidator(self)
intValidator.setRange(0,100)
intlineEdit.setValidator(intValidator)
doubleValidator=QDoubleValidator(self)
doubleValidator.setDecimals(2)
doubleValidator.setRange(0,260)
doubleEdit.setValidator(doubleValidator)
regexpValidator=QRegExpValidator(self)
reg=QRegExp("[a-zA-Z0-9]+$")
regexpValidator.setRegExp(reg)
regexpEdit.setValidator(regexpValidator)
flayout=QFormLayout(self)
flayout.addRow('IntValidator',intlineEdit)
flayout.addRow('DoubleValidator',doubleEdit)
flayout.addRow('RegExpValidator',regexpEdit)
if __name__=="__main__":
app=QApplication(sys.argv)
demo=ValidatorDemo()
demo.show()
sys.exit(app.exec_())
在使用内置的验证器时(就是上面的代码)发现了一个奇怪的问题,需要对QLineEdit进行输入范围限制(0-100)时发现使用setRange(0,100),没有生效,可以输入的范围居然是0~999。查阅了一些资料发现QIntValidator
只是用来验证输入的有效性,但它并不会阻止用户输入不符合规则的值。虽然设置了验证器,但默认情况下,Qt并不会阻止用户输入超出范围的值。如果你想要完全防止用户输入不符合规则的值,你需要重写validate和fixup方法。
- validate: 这个方法被用于验证输入的文本是否符合要求。你要在这个方法里面实现自定义的验证逻辑,如果输入的文本不符合要求会返回QValidator.Invalid,如果输入的文本是部分符合要求的会返回QValidator.Intermediate,如果输入的文本完全符合要求会返回QValidator.Acceptable。
- fixup: 输入的文本不符合要求但是可以修正的时候,这个方法会被调用。你可以在这个方法里实现对用户输入修正的逻辑。比如用户输入了一个超出范围的值,你可以在这个方法里将其修正为最接近的合法值。
下面给一个例子,这个是可以实现输入范围的限制的。不过要注意一下,假设限制的范围是0~100,输入111是正常显示在QLineEdit控件上的,但是按下回车键就会进行修正了。
class MyIntValidator(QIntValidator):
def validate(self, input_text, pos):
# 首先调用父类的 validate 方法进行基本的验证
state, input_text, pos = super().validate(input_text, pos)
# 如果基本验证通过,则进一步检查范围
if state == QValidator.Acceptable:
value = int(input_text)
if value < self.bottom() or value > self.top():
# 如果超出范围,则返回 Intermediate
return QValidator.Intermediate, input_text, pos
# 返回最终的验证结果
return state, input_text, pos
def fixup(self, input_text):
# 如果输入超出范围,修正为最接近的合法值
value = int(input_text)
if value < self.bottom():
return str(self.bottom())
if value > self.top():
return str(self.top())
return input_text
输入掩码
掩码功能允许你限制输入的文本格式。掩码是一个字符串,其中包含了一些特殊字符,用来指定用户输入的格式,例如日期、电话号码、信用卡号等。
下面是一些常用的掩码:
- ‘0’: 表示任意数字字符
- ‘9’: 表示可选的数字字符
- ‘#’: 表示数字字符或空格字符
- ‘L’: 表示任意字母字符
- ‘a’: 表示可选的字母字符
- ‘A’: 表示任意字符
- ‘N’: 表示任意大写字母字符
- ‘n’: 表示可选的大写字母字符
- ‘X’: 表示任意小写字母字符
- ‘x’: 表示可选的小写字母字符
- ‘H’: 表示任意十六进制字符
- ‘h’: 表示可选的十六进制字符
- ‘B’: 表示任意二进制字符
- ‘b’: 表示可选的二进制字符
- ‘>’: 大于符号,表示用户输入的值必须大于掩码中此字符之后的数字。
- ‘<’: 小于符号,表示用户输入的值必须小于掩码中此字符之后的数字。
- ‘=’: 等于符号,表示用户输入的值必须等于掩码中此字符之后的数字。
- ‘!’: 不等于符号,表示用户输入的值必须不等于掩码中此字符之后的数字。
- ‘&’: 逻辑与符号,表示用户输入的值必须满足掩码中此字符之后的多个条件。
- ‘|’: 逻辑或符号,表示用户输入的值必须满足掩码中此字符之后的多个条件中的至少一个。
这个例子是官方的帮助文档中的,下面通过代码实现这个例子
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QFormLayout, QLabel, QLineEdit
from PyQt5.QtGui import QIntValidator,QDoubleValidator,QRegExpValidator,QValidator
class MaskDemo(QWidget):
def __init__(self):
super(MaskDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('掩码控制')
flayout=QFormLayout(self)
ipEdit=QLineEdit()
ipEdit.setInputMask("000:000:000:000;_")#末尾的下划线 _ 表示占位符,当用户在该位置没有输入时,下划线将会被显示。
macEdit=QLineEdit()
macEdit.setInputMask("HH:HH:HH:HH:HH:HH;_")
dateEdit=QLineEdit()
dateEdit.setInputMask("0000-00-00")
licenseEdit=QLineEdit()
licenseEdit.setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#")
flayout.addRow('ip',ipEdit)
flayout.addRow('mac',macEdit)
flayout.addRow('date',dateEdit)
flayout.addRow('license',licenseEdit)
if __name__=='__main__':
app=QApplication(sys.argv)
demo=MaskDemo()
demo.show()
sys.exit(app.exec_())
- 程序预览