PyQt5窗口设计基础之常用控件类(一)

一、文本类控件

主要有LabelLineEditTextEditSpinBoxDoubleSpinBoxLCDNumber


1. Label: 标签控件

属于Qlabel
一般可在QtDesigner中设计初始文本内容、对齐效果等
若要改变标签内容,使用self.label.setText('文本内容')
这类函数可在.ui转成的.py中通过搜索命名来找到其生成代码块进行修改


以下为一些特殊作用函数:

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()方法弹出输入内容,分三次输入12abcd56789

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.NoEcho模式输入结果.png

可以通过修改样式表,将QLineEdit.Password模式的密码掩码修改为其他符号

QLineEdit
{
    lineedit-password-character:9829; /*9829为密码掩码在Unicode中的编号*/
    color: rgb(255, 0, 0);
}
密码掩码修改后.png

  • 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类的属性
最终实现效果如图:

输入前.png

输入后.png


  • 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

综合文本框验证器可得如下效果:

输入前.png
输入后.png

清除掩码时使用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输入掩码

你可能感兴趣的:(PyQt5窗口设计基础之常用控件类(一))