一、文本类控件
主要有Label
、LineEdit
、TextEdit
、SpinBox
、DoubleSpinBox
、LCDNumber
等
1. Label: 标签控件
属于Qlabel
类
一般可在QtDesigner中设计初始文本内容、对齐效果等
若要改变标签内容,使用self.label.setText('文本内容')
这类函数可在.ui转成的.py中通过搜索命名来找到其生成代码块进行修改
以下为一些特殊作用函数:
- 设置文本换行显示
(1)在属性编辑器中勾选wordWrap复选框
(2)或者使用:self.label.setWordWrap(True)
- 为标签设置超链接
在setText()
方法中使用HTML中的标签设置超链接,并将setOpenExternalLinks()
方法设置为True
,以便允许访问超链接
self.label.setText(",a href='网址'>标签内容")
self.label.setOpenExternalLinks(True) # 设置允许访问超链接
- 为标签设置图片
使用QLabel
类中setPixmap()
方法
from PyQt5.QtGui import QPixmap
self.label.setPixmap(QPixmap('图片地址'))
- 获取标签文本
print(self.label.text())
2. LineEdit: 单行文本框
属于QLineEdit
类
方法 | 说明 |
---|---|
setText() |
设置文本框内容 |
text() |
获取文本框内容 |
setPlaceholderText() |
设置文本框浮现文字 |
setMaxLength() |
设置允许文本框内输入字符的最大长度 |
setAlignment() |
设置文本对齐方式 |
setReadOnly() |
设置文本框只读 |
setFocus() |
使文本框获得焦点 |
-
setEchoMode()
方法有四种显示字符的模式
self.lineEdit.setEchoMode(QLineEdit.Normal) # 正常显示输入的字符
self.lineEdit.setEchoMode(QLineEdit.NoEcho) # 不显示任何输入的字符,若是失去焦点再次输入,
# 会导致再次输入的内容添加在原有字符之前,且无法删除
# 无法输入中文
self.lineEdit.setEchoMode(QLineEdit.Password) # 显示与平台相关的密码掩码字符
self.lineEdit.setEchoMode(QLineEdit.PasswordEchoOnEdit) # 编辑时显示字符,失去焦点后显示
#为密码掩码字符,若再次获得焦点输入,则会覆盖之前输入的字符
当为self.lineEdit.setEchoMode(QLineEdit.NoEcho)
时,在QMessageBox.information
使用text()
方法弹出输入内容,分三次输入12
、abcd
、56789
class leditTestWi![QLineEdit.NoEcho模式输入结果.png](https://upload-images.jianshu.io/upload_images/27716777-7cb08685569e8f5e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
ndow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(leditTestWindow, self).__init__(parent)
self.setupUi(self)
# self.lineEdit.setText('这是一个LineText控件测试')
self.lineEdit.setPlaceholderText('请在此处输入你像输入的内容!')
from PyQt5.QtWidgets import QLineEdit
self.lineEdit.setEchoMode(QLineEdit.NoEcho)
self.pushButton.clicked.connect(self.showMessage)
def showMessage(self):
from PyQt5.QtWidgets import QMessageBox # 导入QMessageBox类
# 使用information()方法弹出信息提示
QMessageBox.information(ledittest, "提示框", self.lineEdit.text(), QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
结果为
可以通过修改样式表,将QLineEdit.Password
模式的密码掩码修改为其他符号
QLineEdit
{
lineedit-password-character:9829; /*9829为密码掩码在Unicode中的编号*/
color: rgb(255, 0, 0);
}
-
setValidator()
方法设置文本框验证器
需要导入文本校验器: 整数校验器、浮点数校验器与其他自定义校验器
from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator
①整数校验器的实现
self.lineEditInt.setPlaceholderText('请在此处输入1~99的整数')
# 实例化整形验证器,并设置范围为1-99,并在lineEditInt控件中设置该验证器
intValidator = QIntValidator(self)
intValidator.setRange(1, 99)
self.lineEditInt.setValidator(intValidator)
②浮点数校验器的实现
self.lineEditDouble.setPlaceholderText('请在此处输入-180~180的两位小数')
doubleValidator = QDoubleValidator()
doubleValidator.setRange(-180, 180)
# The string is written as a standard number (i.e. 0.015), not in scientific form
# While you want to use scientific form, you'd better use QDoubleValidator.ScientificNotation(i.e. 1.5E-2)
doubleValidator.setNotation(QDoubleValidator.StandardNotation)
# 设置浮点型校验器保留两位小数
doubleValidator.setDecimals(2)
self.lineEditDouble.setValidator(doubleValidator)
发现使用浮点型校验器有个缺点,就是如果设置在-180~180的两位小数,其实可以输入-180.99~180.99。因此推荐使用自定校验器,用正则表达式来检验
③自定义校验器的实现(使用正则表达式)
self.lineEditRegExp.setPlaceholderText('请在此处输入邮箱')
# The QRegExp class provides pattern matching using regular expressions
from PyQt5.QtCore import QRegExp
reg = QRegExp('^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$')
regExpValidator = QRegExpValidator(self)
regExpValidator.setRegExp(reg)
self.lineEditRegExp.setValidator(regExpValidator)
虽然在Qt官方文档有这么一句:
In Qt 5, the new
QRegularExpression
class provides a Perl compatible implementation of regular expressions and is recommended in place of QRegExp.
但是查阅QRegExpValidator
类发现只有接受QRegExp
类的属性
最终实现效果如图:
-
setInputMask
方法设置掩码,掩码通常有掩码字符和分割符组成,后面可以跟一个分号和空白字符,空白字符在编辑完成后会从文本框中删除,无论此空白在中间还是首尾,常用的掩码有以下几种形式
setInputMask('0000-00-00')
日期掩码
setInputMask('00:00:00')
时间掩码
setInputMask('>AAAA-AAAA-AAAA-0000')
序列号掩码
字符 | 含义 |
---|---|
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 | 二进制格式字符是允许输入的,但不是必须的 |
> | 所有字母字符都大写 |
< | 所有字母字符都小写 |
! | 关闭大小写转换 |
\ | 使用‘\’转义上面列出的字符 |
此时若有需求
①需要在焦点进入前有浮现的提示字符
②得到焦点时出现掩码字符
③失去焦点后若没有输入,则继续浮现输入提示字符;有输入则保留输入
以日期掩码为例,使用事件过滤器eventFilter
class leditTestWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(leditTestWindow, self).__init__(parent)
self.setupUi(self)
self.dataMaskLiedt.installEventFilter(self)
self.dataMaskLiedt.setPlaceholderText('请输入日期:形如xxxx-xx-xx')
# 事件过滤器,借此可以给lineEdit控件新增焦点进入和焦点失去的事件
def eventFilter(self, a0: 'QObject', a1: 'QEvent') -> bool:
if a0 == self.dataMaskLiedt:
if a1.type() == QEvent.FocusIn:
print(111)
self.dataMaskLiedt.setInputMask('0000-00-00')
return True
elif a1.type() == QEvent.FocusOut:
if self.dataMaskLiedt.text() == '--':
print(222)
self.dataMaskLiedt.setInputMask('')
print(self.dataMaskLiedt.text())
self.dataMaskLiedt.setPlaceholderText('请输入日期:形如xxxx-xx-xx')
return True
return False
return False
综合文本框验证器可得如下效果:
清除掩码时使用clearMask()
、clear()
和setText("")
没有效果,需要使用setInputMask("")
来清除原来的掩码,从某种意义上来说,有点像Excel设置单元格格式-数字-自定义
参考链接:(md文件含超链接)
- Qt 官方文档: https://doc.qt.io/
- Qt 类的导航:https://doc.qt.io/qt-5/classes.html
- QLineEdit修改密文显示样式/QLineEdit限制只能输入字母,数字+字母,屏蔽中文输入法
- PyQt5基本控件详解之QLineEdit
- 清除python中的lineEdit输入掩码