接着学习第二个控件4.2.2单行文本框:QLineEdit
分为两块来学习:1. 输入类控件、2. 单行文本框
1. 输入类控件
在Qt Designer中,用于图形界面数据输入的控件(Input Widgets)如下:
Combo Box:组合框
Line Edit:单行文本框
Plain Text Edit:纯文本编辑框
Double Spin Box:小数选择框
Date Edit:日期编辑框
Dial:旋钮
Vertical Scroll Bar:垂直滚动条
Vertical Slider:垂直滑块
Font Combo Box:字体组合框
Text Edit:多行文本框
Spin Box:数字选择框
Time Edit:时间编辑框
Date/Time Edit:日期时间编辑框
Horizontal Scroll Bar:水平滚动条
Horizontal Slider:水平滑块
Key Sequence Edit:按键编辑框
2. 单行文本框
1)单行文本框控件属性和方法 QLineEdit类中的常用属性和方法如表。
2)单行文本框控件输入字符串掩码
单行文本框控件通过inputMask属性或者SetInputMask(s)方法设置字符串掩码,运行时该单行文本框需要输入指定的规范输入字符串。
表中列出了输入掩码的占位符和字面字符:
字符:含义
A:必须输入的(A~Z、a~z)
a,n:允许输入的ASCII字符,但不是必需的
N:必须输入的(A~2、a~z、0~9)
X:任何字符都是必须输入的
x:任何字符都是允许输入的,但不是必需的
9:必须输入(0~9)
0:允许输入(0~9),但不是必需的
D:必须输入(1-9)
d:允许输入(1-9),但不是必需的
#:允许输入数字或加/减符号,但不是必需的
H:必须输入十六进制字符(A~F、a~f、0~9)
h:允许输入十六进制字符(A~F、a~f、0~9),但不是必需的
B:必须输入二进制字符 (0, 1)
b:允许输入二进制字符 (0, 1),但不是必需的
>:所有的字母都大写
<:所有的字母都小写
!:关闭大小写转换
\:使用“\”转义上面列出的字符
QLineEdit类中的常用信号如下:
selectionChanged:当选择的文本内容改变时发送
textEdited:当文本被编辑时发送
returnPressed:光标在行编辑框内点击回车键时发送
textChanged:当修改文本内容时发送
editingFinished:当按返回或者回车键时,或者行编辑失去焦点时发送
cursorPositionChanged:当光标位置改变时发送
inputRejected:如果setValidator() 等设置合法字符范围,当用户输入不合法字符时发送
【例4.2】QlineText单行文本框测试,运行程序,显示如图:
![](https://img-blog.csdnimg.cn/direct/0fb7200d21334bb7b0e85c7e0a678f92.png)
from PyQt6.QtWidgets import QApplication, QLineEdit, QWidget, QFormLayout # 从PyQt6.QtWidgets模块导入所需的类
from PyQt6.QtGui import QIntValidator, QDoubleValidator, QRegularExpressionValidator # 从PyQt6.QtGui模块导入验证器类
from PyQt6.QtCore import QRegularExpression # 从PyQt6.QtCore模块导入正则表达式类
import sys # 导入Python标准库的sys模块
class MyWidget(QWidget): # 定义一个名为MyWidget的类,继承自QWidget
def __init__(self, parent=None): # 定义类的构造函数,parent是父窗口的引用,默认为None
super(MyWidget, self).__init__(parent) # 调用父类QWidget的构造函数
self.setWindowTitle("QLineEdit测试") # 设置窗口标题为“QLineEdit测试”
fLayout = QFormLayout() # 创建一个QFormLayout对象,用于表单布局
leBH = QLineEdit();
leXM = QLineEdit() # 创建两个QLineEdit对象,分别用于输入编号和姓名
leMM = QLineEdit();
leCSRQ = QLineEdit() # 创建两个QLineEdit对象,分别用于输入密码和出生日期
leGL = QLineEdit();
leJBGZ = QLineEdit() # 创建两个QLineEdit对象,分别用于输入工龄和基本工资
leIP = QLineEdit();
leCH = QLineEdit() # 创建两个QLineEdit对象,分别用于输入本机IP地址和车号
fLayout.addRow("编 号", leBH) # 在表单布局中添加一行,标题为“编 号”,控件为leBH
fLayout.addRow("姓 名", leXM) # 在表单布局中添加一行,标题为“姓 名”,控件为leXM
fLayout.addRow("登录密码", leMM) # 在表单布局中添加一行,标题为“登录密码”,控件为leMM
fLayout.addRow("出生日期", leCSRQ) # 在表单布局中添加一行,标题为“出生日期”,控件为leCSRQ
fLayout.addRow("工 龄", leGL) # 在表单布局中添加一行,标题为“工 龄”,控件为leGL
fLayout.addRow("基本工资", leJBGZ) # 在表单布局中添加一行,标题为“基本工资”,控件为leJBGZ
fLayout.addRow("本机IP地址", leIP) # 在表单布局中添加一行,标题为“本机IP地址”,控件为leIP
fLayout.addRow("车 号", leCH) # 在表单布局中添加一行,标题为“车 号”,控件为leCH
self.setLayout(fLayout) # 设置窗口的布局为之前创建的表单布局fLayout
# 设置leBH(编号)的输入掩码,限制只能输入6位数字
leBH.setPlaceholderText("编号为6位") # 设置占位符文本提示用户输入6位编号
leBH.setInputMask("999999") # 设置输入掩码,限制输入为6位数字
# 设置leMM(密码)的输入模式为密码模式,并设置只能输入字母和数字的验证器
leMM.setPlaceholderText("密码是字母数字组合") # 设置占位符文本提示用户密码应由字母和数字组成
leMM.setEchoMode(QLineEdit.EchoMode.Password) # 设置密码输入模式,显示圆点
reg = QRegularExpression("[a-zA-Z0-9]+$") # 创建一个正则表达式对象,匹配由字母和数字组成的字符串
mmValidator = QRegularExpressionValidator(self) # 创建一个正则表达式验证器对象
mmValidator.setRegularExpression(reg) # 设置验证器的正则表达式
leMM.setValidator(mmValidator) # 将验证器设置给leMM,限制其输入为字母和数字的组合
# 设置leGL(工龄)的整型验证器,限制输入范围为[1, 45]
glIntValidator = QIntValidator(self) # 创建一个整型验证器对象
glIntValidator.setRange(1, 45) # 设置验证器的整数范围为1到45
leGL.setValidator(glIntValidator) # 将验证器设置给leGL,限制其输入为1到45之间的整数
# 设置leJBGZ(基本工资)的浮点验证器,限制输入范围为[0, 9999],保留两位小数
jbDoubleValidator = QDoubleValidator(self) # 创建一个浮点验证器对象
jbDoubleValidator.setRange(0.00, 9999.99) # 设置验证器的浮点范围为0到9999.99
jbDoubleValidator.setNotation(QDoubleValidator.Notation.StandardNotation) # 设置使用标准记数法
jbDoubleValidator.setDecimals(2) # 设置小数点后保留两位
leJBGZ.setValidator(jbDoubleValidator) # 将验证器设置给leJBGZ,限制其输入为指定范围内的浮点数
# 设置leCSRQ(出生日期)的输入掩码,限制输入格式为"年-月-日"
leCSRQ.setInputMask("9999-00-00") # 设置输入掩码为日期格式
# 设置leIP(本机IP地址)的输入掩码,限制输入格式为IP地址
leIP.setInputMask("000.000.000.000") # 设置输入掩码为IP地址格式
# 设置leCH(车号)的输入掩码,限制输入格式为7位数字或字母
leCH.setInputMask("XXXXXXX") # 设置输入掩码为7位字符格式
if __name__ == "__main__": # 判断当前模块是否作为主程序运行
app = QApplication(sys.argv) # 创建QApplication对象,sys.argv是命令行参数列表
w = MyWidget() # 创建MyWidget对象
w.show() # 显示窗口
sys.exit(app.exec()) # 进入应用的主事件循环,等待用户操作,直到程序关闭
这段代码主要实现了以下功能:
- 创建一个包含多个
QLineEdit
控件的自定义窗口MyWidget
,用于用户输入不同的信息。 - 为每个
QLineEdit
控件设置特定的验证器或输入掩码,以确保用户输入的数据符合特定的格式或范围。
使用的布局和控件如下:
- 布局:使用了
QFormLayout
,它创建了一个表单样式的布局,其中标签(如“编 号”)和对应的输入框(QLineEdit
)成对出现。 - 控件:
QLineEdit
:用于获取用户输入的单行纯文本或密码。QFormLayout
:用于组织表单样式的布局。
关键语句包括:
-
设置输入掩码:
leBH.setInputMask("999999") leCSRQ.setInputMask("9999-00-00") leIP.setInputMask("000.000.000.000") leCH.setInputMask("XXXXXXX")
这些语句为每个
QLineEdit
控件设置了输入掩码,以限制用户输入的数据格式。例如,leBH.setInputMask("999999")
确保编号只能输入6位数字。 -
设置密码显示模式:
leMM.setEchoMode(QLineEdit.EchoMode.Password)
这将密码输入框
leMM
的显示模式设置为密码模式,即用户输入的字符将显示为圆点。 -
设置正则表达式验证器:
reg = QRegularExpression("[a-zA-Z0-9]+$") mmValidator = QRegularExpressionValidator(self) mmValidator.setRegularExpression(reg) leMM.setValidator(mmValidator)
这里创建了一个正则表达式验证器,确保密码只能包含字母和数字。然后将其设置为
leMM
的验证器。 -
设置整型验证器:
glIntValidator = QIntValidator(self) glIntValidator.setRange(1, 45) leGL.setValidator(glIntValidator)
这里设置了一个整型验证器,用于限制工龄在1到45之间。
-
设置浮点型验证器:
jbDoubleValidator = QDoubleValidator(self) jbDoubleValidator.setRange(0.00, 9999.99) jbDoubleValidator.setNotation(QDoubleValidator.Notation.StandardNotation) jbDoubleValidator.setDecimals(2) leJBGZ.setValidator(jbDoubleValidator)
这里设置了一个浮点型验证器,用于限制基本工资在0到9999.99之间,并且保留两位小数。通过以上的设置,这个自定义窗口
MyWidget
可以帮助用户输入符合特定格式或范围的数据,同时提供了友好的用户界面。
【例4.3】QLineEdit单行文本框测试。测试如图:
from PyQt6.QtWidgets import QApplication, QLineEdit, QWidget, QFormLayout # 导入必要的PyQt6模块
from PyQt6.QtGui import QIntValidator, QDoubleValidator, QFont # 导入验证器和字体模块
from PyQt6.QtCore import Qt # 导入Qt的枚举类型
import sys # 导入sys模块,用于处理命令行参数
class MyWidget(QWidget): # 定义一个继承自QWidget的自定义窗口类
def __init__(self, parent=None): # 定义初始化方法
super(MyWidget, self).__init__(parent) # 调用父类的初始化方法
le1 = QLineEdit() # 创建第一个QLineEdit对象
le1.setValidator(QIntValidator()) # 为le1设置整数验证器
le1.setMaxLength(6) # 设置le1的最大输入长度为6
le2 = QLineEdit() # 创建第二个QLineEdit对象
le2.setValidator(QDoubleValidator(0.99, 99.99, 2)) # 为le2设置小数验证器,限制范围为0.99到99.99,保留两位小数
le2.textChanged.connect(self.textchanged) # 当le2的文本改变时,调用self.textchanged方法
le3 = QLineEdit() # 创建第三个QLineEdit对象
le3.setInputMask('+99-0000-00000000') # 为le3设置输入掩码,用于格式化输入内容
le4 = QLineEdit("软件工程") # 创建第四个QLineEdit对象,并设置初始文本为"软件工程"
le4.setFont(QFont("黑体", 20)) # 设置le4的字体为"黑体",字号为20
le4.setAlignment(Qt.AlignmentFlag.AlignRight) # 设置le4的文本对齐方式为右对齐
le4.editingFinished.connect(self.enterPress) # 当le4的编辑完成时,调用self.enterPress方法
le5 = QLineEdit("2022-07-28") # 创建第五个QLineEdit对象,并设置初始文本为"2022-07-28"
le5.setReadOnly(True) # 设置le5为只读,用户不能修改其内容
self.setWindowTitle("QLineEdit测试") # 设置窗口的标题为"QLineEdit测试"
fLayout = QFormLayout() # 创建一个表单布局对象
fLayout.addRow("整数(0-6位)", le1) # 在表单布局中添加一行,标题为"整数(0-6位)",对应的控件为le1
fLayout.addRow("实数(xx.xx)", le2) # 在表单布局中添加一行,标题为"实数(xx.xx)",对应的控件为le2
fLayout.addRow("文本字体字号对右", le3) # 添加le3到表单布局中,但这里的文本与le3的实际功能不匹配
fLayout.addRow("输入 文本", le4) # 添加le4到表单布局中
fLayout.addRow("只读文本", le5) # 添加le5到表单布局中
self.setLayout(fLayout) # 设置窗口的布局为fLayout
def textchanged(self, txt): # 定义一个方法,当le2的文本改变时调用
print("输入:" + txt) # 打印输入的文本
def enterPress(self): # 定义一个方法,当le4的编辑完成时调用
print("本行输入完成!") # 打印提示信息
if __name__ == "__main__": # 判断当前模块是否为直接运行的主模块
app = QApplication(sys.argv) # 创建QApplication对象
w = MyWidget() # 创建MyWidget对象
w.show() # 显示窗口
sys.exit(app.exec()) # 进入Qt的事件循环,等待用户操作,最后退出程序
这段代码主要实现了以下功能:
- 创建了一个包含五个
QLineEdit
控件的自定义窗口MyWidget
。 - 为每个
QLineEdit
控件设置了不同的属性或行为,例如输入验证、输入掩码、字体、对齐方式以及只读状态。 - 当第二个
QLineEdit
(le2
)的文本内容发生变化时,将打印出变化后的文本。 - 当第四个
QLineEdit
(le4
)的编辑完成时(即用户按下了Enter键或点击了其他地方),将打印一条消息。
使用的布局和控件如下:
- 布局:
QFormLayout
,它创建了一个表单样式的布局,其中标签(如“整数(0-6位)”)和对应的输入框(QLineEdit
)成对出现。 - 控件:
QLineEdit
:用于获取用户输入的单行纯文本。
关键语句包括:
-
设置整数验证器和最大长度:
le1.setValidator(QIntValidator()) le1.setMaxLength(6)
这里为
le1
设置了整数验证器,确保用户只能输入整数,并通过setMaxLength(6)
限制最大长度为6位。 -
设置浮点数验证器:
le2.setValidator(QDoubleValidator(0.99, 99.99, 2))
为
le2
设置了浮点数验证器,限制输入值在0.99到99.99之间,并且保留两位小数。 -
设置输入掩码:
le3.setInputMask('+99-0000-00000000')
这为
le3
设置了输入掩码,定义了用户应该如何输入数据(例如电话号码格式)。 -
设置字体和对齐方式:
le4.setFont(QFont("黑体", 20)) le4.setAlignment(Qt.AlignmentFlag.AlignRight)
这里设置了
le4
的字体为“黑体”且字号为20,并将文本内容对齐到右侧。 -
设置只读状态:
le5.setReadOnly(True)
这使
le5
成为只读,用户不能修改其内容。 -
信号与槽的连接:
le2.textChanged.connect(self.textchanged) le4.editingFinished.connect(self.enterPress)
这里将
le2
的textChanged
信号连接到self.textchanged
槽,当le2
的文本内容发生变化时,会调用self.textchanged
方法。同样,将le4
的editingFinished
信号连接到self.enterPress
槽,当le4
的编辑完成时,会调用self.enterPress
方法。
通过这些设置和关键语句,这个自定义窗口MyWidget
可以帮助用户输入符合特定格式或范围的数据,同时提供了灵活的文本编辑体验。