QLineEdit单行文本输入框

  • 描述
  • 是一个单行文本编辑器,允许用户输入和编辑单行纯文本
  • 自带一组编辑功能:撤销、重做、剪切、粘贴、拖放
  • 继承自:QWidget
  • 功能作用
  • 控件的创建
QLineEdit(parent: QWidget = None)               # 创建的同时设置父控件
QLineEdit(str, parent: QWidget = None)          # 创建的同时添加内容和设置父控件
  • 文本的设置和获取
setText(str)                                    # 设置内容文本
insert(newText)                                 # 在光标处插入文本
text()                                          # 获取真实内容文本(用户输入的内容)
displayText()                                   # 获取用户能看到的内容文本(密文显示时获取的是密文)
  • 显示模式(回显模式)
  • 设置输入内容后显示方式:正常显示 or 密文显示
setEchoMode(QLineEdit.EchoMode)                 # 设置输出模式
    # 参数QLineEdit.EchoMode    
     NoEcho = 1                              # 不输出(不显示内容,实际是有内容)
     Normal = 0                              # 正常输出
     Password = 2                            # 密文形式
     PasswordEchoOnEdit = 3                  # 编辑时明文, 结束后密文

echoMode()                                      # 获取文本框输出模式
# 返回:QLineEdit.NoEcho / QLineEdit.Normal / QLineEdit.Password / QLineEdit.PasswordEchoOnEdit
  • 占位提示字符串
  • 在用户输入文本内容之前, 给用户的提示语句。输入内容后会自动消失
setPlaceholderText(notice_str)                  # 设置占位提示字符

placeholderText()                               # 获取占位提示字符内容
  • 清空按钮显示
  • 用作一键快速清空文本框内容
setClearButtonEnabled(bool)                     # 设置是否显示清空按钮

isClearButtonEnabled() -> bool                  # 获取是否设置显示清空按钮
  • 添加操作行为
  • 为密码文本框添加显示明文和显示密文切换按钮
addAction(QAction, QLineEdit.ActionPosition)            # 通过QAction对象添加
addAction(QIcon, QLineEdit.ActionPosition) -> QAction   # 通过QIcon对象添加,返回QAction对象

    # 参数QLineEdit.ActionPosition
              QLineEdit.LeadingPosition   # 显示在最前面
              QLineEdit.TrailingPosition  # 显示在最后面
              
# 通过QAction对象的triggered信号连接槽函数,通过槽函数来设置相关属性
  • 自动补全
  • 根据用户已输入的字符串, 下拉显示以往记录
setCompleter(QCompleter)                                # 设置完成器

QCompleter(Iterable[str], parent: QObject = None)       # 创建QCompleter对象

# 示例
# 创建QCompleter对象,用于自动补全参数
completer = QCompleter(['FengZi','Fz','WangZhe','chiJi'], self.account_le)      
self.account_le.setCompleter(completer)                 # 设置自动补全
  • 输入限制
  • 设置最大长度后,输入内容字符个数不能超过最大长度,即使是通过代码写入setText()也不行
  • 设置只读限制后,文本框中的文本只能查看,不能修改。但是通过代码setText()可以进行修改
  • 关于QValidator验证器对象
  • 掩码:掩码可以指定固定位置的固定数据类型, 达到一个格式上的限制
  • 例如:座机号码(四位区号-七位电话),IP地址(XXX.XXX.XXX.XXX)
  • 格式:掩码字符 + 分隔符组成 [+ ;空白占位字符]
格式示例:9999-9999999;0
说明:-作为分隔符,前面限定填写4位数字,后面限定填写7位数字,没有填写的时候默认显示0
  • 掩码字符

掩码字符

说明1

说明2

A

需要ASCII字母字符AZ,az

ASCII字母字符是必须输入的(A-Z、a-z)

a

允许但不要求使用ASCII字母字符

ASCII字母字符是允许输入的,但不是必需的(A-Z、a-z)

N

需要ASCII字母数字字符AZ,az,0-9

ASCII字母字符是必须输入的(A-Z、a-z、0-9)

n

允许但不要求使用ASCI字母数字字符

ASII字母字符是允许输入的,但不是必需的(A-Z、a-z、0-9)

X

需要任何角色

任何字符都是必须输入的

x

允许但不要求的任何角色

任何字符都是允许输入的,但不是必需的

9

需要ASCII数字0-9

ASCII数字字符是必须输入的(0-9)

0

允许使用ASCII数字但不是必需的

ASCII数字字符是允许输入的,但不是必需的(0-9)

D

需要ASCII数字1-9

ASCII数字字符是必须输入的(1-9)

d

允许但不需要ASCII数字 (1-9)

ASCII数字字符是允许输入的,但不是必需的(1-9)

#

允许但不要求ASCII数字或加号/减号

ASCI数字字符或加减符号是允许输入的,但不是必需的

H

需要十六进制字符AF,af,0-9

十六进制格式字符是必须输入的(A-F、a-f、0-9)

h

允许使用十六进制字符,但不是必需的

十六进制格式字符是允许输入的,但不是必需的(A-F、a-f、0-9)

B

需要二进制字符0-1

二进制格式字符是必须输入的(0,1)

b

允许二进制字符但不是必需的

二进制格式字符是允许输入的,但不是必需的(0,1)

>

以下所有字母字符均为大写字母

所有的字母字符都大写

<

以下所有字母字符均为小写字母

所有的字母字符都小写

!

关闭大小转换

关闭大小写转换

\

使用\逃脱上面列出的特殊字符使用它们作为分隔符

使用""转义上面列出的字符

[]{}

保留

# 内容长度限制
    setMaxLength(int)                                   # 设置限制输入的最大长度(字符个数,不是字节数)
    maxLength()                                         # 获取设定的最大输入长度
    
# 只读限制
    setReadOnly(bool)                                   # 设置内容只读,可以选中复制,不能修改
    isReadOnly()                                        # 获取是否设置只读
    
# 规则验证
    setValidator(QValidator)                            # 设置验证器验证
        # 参数QValidator:验证器对象
        # QValidator属于抽象类,不能直接实例化创建对象
        # 需要子类化该类(自定义一个类继承自QValidator)
        # class MyValidator(QValidator):
        
    setInputMask(mask_str)                              # 掩码验证
     # 参数mask_str:掩码字符
     
# 判定输入的内容是否满足inputMask和validator的要求(是否满足规则验证和掩码验证的规则)
    hasAcceptableInput()
  • 是否被编辑过
isModified()                # 获取文本框是否被编辑过(编辑之后光标离开,依然返回True)
                            # 这里获取的并不是文本框是否可以编辑,也不是获取是否正在编辑

setModified(bool)           # 设置文本框是否被编辑过
  • 光标控制
  • 注意:文本框输入内容时,是向右走,所以向前为向右,相反,向后则是向左
cursorBackward(bool mark,int steps = 1)                # 向后(左)移动steps个字符
    # 参数: mark        # 是否带选中效果(是否选中文本)
          # steps       # 移动的步长
cursorForward(bool mark,int steps = 1)                 # 向前(右)移动steps个字符
    # 参数: mark        # 是否带选中效果(是否选中文本)
          # steps       # 移动的步长
cursorWordBackward(bool mark)                           # 向后(左)移动一个单词长度(以空格为分隔,并不是一个字符长度)
                                                        # 从光标位置向后(左)移动到下一个空格之后
    # 参数: mark        # 是否带选中效果(是否选中文本)
cursorWordForward(bool mark)                            # 向前(右)移动一个单词长度(以空格为分隔,并不是一个字符长度)
                                                        # 从光标位置向前(右)移动到下一个空格之前
    # 参数: mark        # 是否带选中效果(是否选中文本)
home(bool)                                              # 移动到行首
    # 参数: mark        # 是否带选中效果(是否选中文本)
end(bool)                                               # 移动到行尾
    # 参数: mark        # 是否带选中效果(是否选中文本)
  
setCursorPosition(int)                                  # 设置光标位置
cursorPosition()                                        # 获取光标位置
cursorPositionAt(const QPoint& pos)                    # 获取指定坐标位置对应文本光标位置,这个坐标是相对于文本框的左上角
# 注意:如果文本框内容超出了文本框长度,左侧有隐藏的文本,那么光标的位置是会加上隐藏部分的字符数
  • 关于cursorPositionAt(const QPoint& pos)图解
  • 文本边距设置
getTextMargins()                                                # 获取文本内容的边距,返回一个元组
setTextMargins(int left,int top,int right,int bottom)        # 设置文本内容边距
  • 文本框输入文本默认位于文本框横向靠左,纵向居中
  • 这里需要注意与 setContentsMargins 的区别
  • 对齐方式
setAlignment(Qt.Alignment)              # 设置文本内容对其方式
    # 参数Qt.Alignment
        # 水平方向
            Qt.AlignLeft                # 水平居左
            Qt.AlignRight               # 水平居右
            Qt.AlignHCenter             # 水平居中
            Qt.AlignJustify             # 水平方向调整间距两端对齐
        # 垂直方向
            Qt.AlignTop                 # 垂直居上
            Qt.AlignBottom              # 垂直居下
            Qt.AlignVCenter             # 垂直居中
            Qt.AlignBaseline            # 与基线对齐
        Qt.AlignCenter                  # 垂直和水平都居中,相当于Qt.AlignHCenter | Qt.AlignVCenter

alignment()                             # 获取文本内容对其方式,返回 Qt.Alignment 对象
  • 通过文本内容对其方式设置和文本边距设置进行配合使用,能将文本内容调整到自己想要的任何位置
  • 常用编辑功能
# 以下常用编辑功能,在文本框的右键菜单中都有了
backspace()                 # 删除选中文本(如果有) 或 删除光标左侧一个字符
del_()                      # 删除选中文本(如果有) 或 删除光标右侧的一个字符
clear()                     # 删除文本框所有内容
copy()                      # 复制
cut()                       # 剪切
paste()                     # 粘贴
isUndoAvailable()           # 撤消是否可用
undo()                      # 撤消
isRedoAvailable()           # 重做是否可用
redo()                      # 重做

setDragEnabled(bool)        # 设置选中文本后是否可以拖拽

setSelection(start_pos, length)     # 选中指定区间的文本
selectAll()                         # 选中所有文本
deselect()                          # 取消选中已选择文本
hasSelectedText()                   # 是否有选中文本
selectedText() -> str               # 获取选中的文本
selectionStart() -> int             # 选中的开始位置
selectionEnd() -> int               # 选中的结束位置
selectionLength() -> int            # 选中的长度
  • backspace()、del_()、copy()、cut()、paste() 这些编辑功能做在按钮上,那么通过鼠标选中多个字符,再点击按钮时,并不能编辑多个字符,会删掉选中字符左侧一个字符
  • 原因:当鼠标点击按钮的时候,文本框会丢失焦点同时会取消选中状态
  • 如果需要做到删除多个字符,需要通过代码对字符进行选中
  • 可用信号
textEdited(text)                                    # 常用,文本编辑时发射的信号(通过代码设置文本内容时候不会触发该信号)
textChanged(text)                                   # 常用,文本框文本发生改变时发出的信号
returnPressed()                                     # 常用,按下回车键时发出的信号
editingFinished()                                   # 常用,结束编辑时发出的信号(按下回车键、Tab键、丢失焦点时)
cursorPositionChanged(int oldPos,int newPos)       # 光标位置发生改变时发出的信号,传递原光标位置和新光标位置
selectionChanged()                                  # 选中的文本发生改变时发出的信号(光标开始移动时就会触发该信号,并不需要等到选中文本)


  • 示例代码
  • 示例1:QLineEdit-创建使用
from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)
window = QWidget()
window.resize(500, 500)
window.setWindowTitle('QLineEdit-创建使用')

# 创建的同时设置提示文本和父对象
lie = QLineEdit('请输入账号', window)
lie.move(100,100)

# 设置提示文本
lie.setText('修改了内容')
# 获取真实的内容
print(lie.text())
# 获取看到的内容
print(lie.displayText())

btn = QPushButton("插入",window)
btn.move(100, 130)
btn.pressed.connect(lambda :lie.insert('插入新内容'))

window.show()
sys.exit(app.exec_())

  • 示例2:QLineEdit文本的设置和获取
  • 案例要求:
  • 创建一个窗口, 添加两个文本框一个按钮
  • 点击按钮后,将文本框A内输入的内容复制到文本框B中
from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)
window = QWidget()
window.resize(500, 500)
window.setWindowTitle('QLineEdit-案例1')

# 案例要求:
# 创建一个窗口, 添加两个文本框一个按钮
# 点击按钮后,将文本框A内输入的内容复制到文本框B中

linea = QLineEdit(window)
lineb = QLineEdit(window)

linea.move(100, 100)
lineb.move(100, 150)

btn = QPushButton('复制内容', window)
btn.move(100, 200)

def cao():
    lineb.setText(linea.text())

btn.clicked.connect(cao)
window.show()
sys.exit(app.exec_())

  • 案例3:QLineEdit显示模式
from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)
window = QWidget()
window.resize(500, 500)
window.setWindowTitle('QLineEdit-输出模式')

line1 = QLineEdit(window)
line2 = QLineEdit(window)
line3 = QLineEdit(window)
line4 = QLineEdit(window)

line1.resize(100, 30)
line2.resize(100, 30)
line3.resize(100, 30)
line4.resize(100, 30)

line1.move(100, 100)
line2.move(100, 150)
line3.move(100, 200)
line4.move(100, 250)

# NoEcho = 1                # 不输出
# Normal = 0                # 正常输出
# Password = 2              # 密文输出
# PasswordEchoOnEdit = 3    # 编辑时正常输出,失去光标时候显示密文

line1.setEchoMode(QLineEdit.NoEcho)
line2.setEchoMode(QLineEdit.Normal)
line3.setEchoMode(QLineEdit.Password)
line4.setEchoMode(QLineEdit.PasswordEchoOnEdit)

leb1 = QLabel(window)
leb2 = QLabel(window)
leb3 = QLabel(window)
leb4 = QLabel(window)

leb1.resize(100, 30)
leb2.resize(100, 30)
leb3.resize(100, 30)
leb4.resize(100, 30)

leb1.move(220, 100)
leb2.move(220, 150)
leb3.move(220, 200)
leb4.move(220, 250)

leb5 = QLabel(window)
leb6 = QLabel(window)
leb7 = QLabel(window)
leb8 = QLabel(window)

leb5.resize(100, 30)
leb6.resize(100, 30)
leb7.resize(100, 30)
leb8.resize(100, 30)

leb5.move(340, 100)
leb6.move(340, 150)
leb7.move(340, 200)
leb8.move(340, 250)

btn1 = QPushButton('显示真实内容', window)
btn1.move(220, 300)

btn2 = QPushButton('显示看到内容', window)
btn2.move(340, 300)

def cao1():
    leb1.setText(line1.text())
    leb2.setText(line2.text())
    leb3.setText(line3.text())
    leb4.setText(line4.text())

def cao2():
    leb5.setText(line1.displayText())
    leb6.setText(line2.displayText())
    leb7.setText(line3.displayText())
    leb8.setText(line4.displayText())

btn1.clicked.connect(cao1)
btn2.clicked.connect(cao2)
window.show()
sys.exit(app.exec_())

  • 示例4:QLineEdit登录框案例
  • 涉及内容:
  • 输出模式(显示模式:密文、明文、不显示)
  • 占位提示字符串(灰色提示文本)
  • 清空按钮(尾部一键清空按钮)
  • 操作行为(明文和密文切换显示)
  • 自动补全(下拉显示最近记录)
from PyQt5.Qt import *
import sys

class AccountTool:
    """定义一个账号工具类,专门用来返回连接状态"""
    # @staticmethod定义方法为静态方法,调用时无需创建对象,可以通过类名.方法名直接调用
    @staticmethod
    def connect_dba(account, pwd):
        """
        通过传入的账号和密码,进行连接
        :param account: 账号
        :param pwd: 密码
        :return: 返回连接状态(0:已连接,1:账号错误,2:密码错误)
        """
        if account != 'FengZi':
            return 1
        if pwd != 'abc123':
            return 2
        return 0

class Windows(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QLineEdit-登录框案例')
        self.resize(600, 300)
        self.setMinimumSize(300, 230)
        self.setMaximumSize(600, 300)

        # self.account_le = None
        # self.pwd_le = None
        # self.login_btn = None

        self.widget_list()

    def widget_list(self):
        self.add_widget()


    def add_widget(self):
        self.account_le = QLineEdit(self)
        self.pwd_le = QLineEdit(self)
        self.login_btn = QPushButton('登录', self)

        # 账号文本框相关设置
        self.account_le.setPlaceholderText('请输入账号')         # 设置占位符文本

        # 创建QCompleter对象,用于自动补全参数
        completer = QCompleter(['FengZi','Fz','WangZhe','chiJi'], self.account_le)
        self.account_le.setCompleter(completer)                 # 设置自动补全

        # 密码文本框相关设置
        self.pwd_le.setEchoMode(QLineEdit.Password)             # 设置输出模式为密文
        self.pwd_le.setPlaceholderText('请输入密码')             # 设置占位符文本
        self.pwd_le.setClearButtonEnabled(True)                 # 设置开启清空按钮
        # 给密码文本框添加行为(显示铭文和显示密文)
        action = QAction(self.pwd_le)
        action.setIcon(QIcon('../images/png/close1.png'))

        def echomod_cao():
            if self.pwd_le.echoMode() == QLineEdit.Password:
                action.setIcon(QIcon('../images/png/open1.png'))
                self.pwd_le.setEchoMode(QLineEdit.Normal)
            else:
                action.setIcon(QIcon('../images/png/close1.png'))
                self.pwd_le.setEchoMode(QLineEdit.Password)

        action.triggered.connect(echomod_cao)
        # self.pwd_le.addAction(action, QLineEdit.LeadingPosition)      # 显示在最前面
        self.pwd_le.addAction(action, QLineEdit.TrailingPosition)     # 显示在最后面

        self.login_btn.clicked.connect(self.login_cao)

    def login_cao(self):
        # 获取账号和密码信息
        account = self.account_le.text()
        pwd = self.pwd_le.text()

        # 对账号进行验证判断

        # 方法一:嵌套比较多,太麻烦
        # if account == 'Fz':
        #     # 账号正确之后,再对密码进行验证判断
        #     if pwd == 'abc123':
        #         print('登录成功,欢迎使用!')
        #     else:
        #         print('密码错误,请重新输入!')
        #         self.pwd_le.setText("")
        #         self.pwd_le.setFocus()
        # else:
        #     print('账号错误,请重新输入')
        #     self.account_le.setText("")
        #     self.pwd_le.setText("")
        #     self.account_le.setFocus()

        # # 方法二:分别对账号和密码进行验证判断
        # # 任何一个错误就return来结束
        # if account != 'FengZi':
        #     print('账号错误,请重新输入!')
        #     self.account_le.setText("")
        #     self.pwd_le.setText("")
        #     self.account_le.setFocus()
        #     return None
        # if pwd != 'abc123':
        #     print('密码错误,请重新输入!')
        #     self.pwd_le.setText("")
        #     self.pwd_le.setFocus()
        #     return None
        # print('登录成功,欢迎使用!')

        # 方法三:抽离业务逻辑,创建单独的工具类,调用工具类返回连接状态
        state = AccountTool.connect_dba(account, pwd)
        if state == 1:
            print('账号错误,请重新输入!')
            self.account_le.setText("")
            self.pwd_le.setText("")
            self.account_le.setFocus()
            return None
        if state == 2:
            print('密码错误,请重新输入!')
            self.pwd_le.setText("")
            self.pwd_le.setFocus()
            return None
        print('登录成功,欢迎使用!')

    def resizeEvent(self, evt) -> None:
        """窗口大小改变事件"""
        dist_left = int(self.width() / 60)           # 控件左右间距
        dist_top = int(self.height() / 15)           # 控件顶部间距
        dist_cent = 10                               # 控件之间的距离

        widget_w = self.width() - 2 * dist_left    # 控件宽度
        widget_h = 30                               # 控件高度

        # 根据窗口大小设置控件大小
        self.account_le.resize(widget_w, widget_h)
        self.pwd_le.resize(widget_w, widget_h)
        self.login_btn.resize(widget_w, widget_h)

        # 根据窗口大小设置控件位置
        self.account_le.move(dist_left, dist_top)
        self.pwd_le.move(self.account_le.x(), self.account_le.y() + widget_h + dist_cent)
        self.login_btn.move(self.pwd_le.x(), self.pwd_le.y() + widget_h + dist_cent)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Windows()

    w.show()
    sys.exit(app.exec_())

  • 示例5:QLineEdit输入限制_限制长度和只读
from PyQt5.Qt import *
import sys

class Windows(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QLineEdit-输入限制')
        self.resize(980, 500)
        self.widget_list()

    def widget_list(self):
        self.add_widget()


    def add_widget(self):
        le1 = QLineEdit(self)
        le2 = QLineEdit(self)

        le1.move(100, 100)
        le2.move(100, 150)

        le1.setPlaceholderText('长度限制为3个字符')
        le2.setText('限制为只读模式')

        le1.setMaxLength(5)
        le2.setReadOnly(True)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Windows()

    window.show()
    sys.exit(app.exec_())

  • 示例6:QLineEdit输入限制_验证器限制
  • 关于限制器,详见下一节笔记
from PyQt5.Qt import *
import sys

class MyValidator(QValidator):
    """子类化QValidator类"""
    def validate(self, a0: str, a1: int):
        """
        文本框设置了验证后,当内容发生改变时调用该方法
        :param a0: 文本框内容
        :param a1: 光标位置
        :return: 返回验证状态
                 QValidator.Acceptable:验证通过
                 QValidator.Intermediate:暂不验证,文本框失去焦点时调用fixup()方法进行验证
                 QValidator.Invalid:验证不通过
        """
        try:
            if 1 <= int(a0) <= 17:
                print('暂时不处理', a0)
                return (QValidator.Intermediate, a0, a1)
            elif 18 <= int(a0) <= 120:
                print('validator中满足条件', a0)
                return (QValidator.Acceptable, a0, a1)
            else:
                print('validator中超出范围', a0)
                return (QValidator.Invalid, a0, a1)
        except:
            print('validator中转换报错', a0)
            return (QValidator.Invalid, '18', a1)


    def fixup(self, a0: str) -> str:
        """
        当文本框失去焦点,并且validate返回的是 QValidator.Intermediate 时调用
        :param a0: 文本框内容
        :return: 返回要显示在文本框里面的内容
        """
        try:
            if 18 > int(a0):
                print('fixup中数值太小了', a0)
                return '18'
        except:
            print('fixup中转换报错', a0)
            return a0

class Windows(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QLineEdit-验证器限制')
        self.resize(980, 500)
        self.widget_list()

    def widget_list(self):
        self.add_widget()


    def add_widget(self):
        le_1 = QLineEdit(self)
        le_2 = QLineEdit(self)

        le_1.move(100, 100)
        le_2.move(100, 150)

        le_1.setPlaceholderText('请输入数字18~120')
        validate = MyValidator()
        le_1.setValidator(validate)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Windows()

    window.show()
    sys.exit(app.exec_())

  • 示例7:QLineEdit输入限制-掩码限制
from PyQt5.Qt import *
import sys

class Windows(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QLineEdit-掩码限制')
        self.resize(980, 500)
        self.widget_list()

    def widget_list(self):
        self.add_widget()


    def add_widget(self):
        le1 = QLineEdit(self)
        le2 = QLineEdit(self)
        le3 = QLineEdit(self)
        le4 = QLineEdit(self)
        le5 = QLineEdit(self)

        lab1 = QLabel('座机号码:',self)
        lab2 = QLabel(' IP地址:',self)
        lab3 = QLabel('身份证号:',self)
        lab4 = QLabel('Mac地址:',self)
        lab5 = QLabel('掩码测试:',self)

        le1.move(130, 100)
        le2.move(130, 150)
        le3.move(130, 200)
        le4.move(130, 250)
        le5.move(130, 300)

        lab1.move(50, 105)
        lab2.move(50, 155)
        lab3.move(50, 205)
        lab4.move(50, 255)
        lab5.move(50, 305)

        # 座机号码:4位区号-7位电话,默认显示0
        le1.setInputMask('9999-9999999;0')
        #  IP地址:3位数字.3位数字.3位数字.3位数字,默认显示X
        le2.setInputMask('999.999.999.999;')
        # 身份证号:17位数字+1位数字或大写字母
        le3.setInputMask('99999999999999999>N')
        # Mac地址:6组 十六进制字符,分隔符为:,默认显示_
        le4.setInputMask('HH:HH:HH:HH:HH:HH;_')
        # 测试掩码:1位大写字母+1位大小写字母_6位大小写字母或者数字
        le5.setInputMask('>A!A_NNNNNN')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Windows()

    window.show()
    sys.exit(app.exec_())
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = Windows()
    
        window.show()
        sys.exit(app.exec_())

  • 示例8:QLineEdit-获取输入内容是否满足规则限制或者掩码限制
from PyQt5.Qt import *
import sys

class Windows(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QLineEdit-文本是否通过验证')
        self.resize(980, 500)
        self.widget_list()

    def widget_list(self):
        self.add_widget()


    def add_widget(self):
        le1 = QLineEdit(self)
        le2 = QLineEdit(self)


        le1.move(100, 100)
        le2.move(100, 150)

        le1.setInputMask('999')     # 设置内容要求是3个数字
        le1.setInputMask('AAA')     # 设置内容要求是3个字母

        le1.setText('123')          # 写入三个字符的字符串
        le2.setText('abc')          # 写入三个字母

        # 判定输入的内容是否满足inputMask和validator的要求(是否满足规则验证和掩码验证的规则)
        print(le1.hasAcceptableInput())     # 返回False,写入的是字符串,不是数字
        print(le2.hasAcceptableInput())     # 返回True


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Windows()

    window.show()
    sys.exit(app.exec_())

  • 示例9:QLineEdit-光标控制
from PyQt5.Qt import *
import sys

class Windows(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QLineEdit-光标控制')
        self.resize(980, 500)
        self.widget_list()

    def widget_list(self):
        self.add_widget()


    def add_widget(self):
        """
        cursorBackward(bool mark,int steps = 1)                # 向后(左)移动steps个字符
        cursorForward(bool mark,int steps = 1)                 # 向前(右)移动steps个字符
        cursorWordBackward(bool mark)                           # 向后(左)移动一个单词长度(以空格为分隔,并不是一个字符长度)
        cursorWordForward(bool mark)                            # 向前(右)移动一个单词长度(以空格为分隔,并不是一个字符长度)
        home(bool)                                              # 移动到行首
        end(bool)                                               # 移动到行尾
        setCursorPosition(int)                                  # 设置光标位置
        cursorPosition()                                        # 获取光标位置
        cursorPositionAt(const QPoint& pos)                    # 获取指定坐标位置对应文本光标位置,这个坐标是相对于文本框的左上角

        :return:
        """
        le1 = QLineEdit(self)
        le1.resize(400, 30)
        le1.move(100, 30)
        le1.setText('QLineEdit 光标位置 移动 相关操作')

        le2 = QLineEdit(self)       # 用来设置光标移动位置
        le2.setInputMask('9999')

        le3 = QLineEdit(self)
        le3.resize(400, 30)
        le3.move(100, 80)
        le3.setText('获取指定坐标位置对应文本光标位置,这个坐标是相对于文本框的左上角')

        lab = QLabel('获取指定坐标位置对应文本光标位置,这个坐标是相对于文本框的左上角', self)
        le1.end(False)
        lab.move(18, 120)

        lab1 = QLabel(self)     # 用于点击按钮8之后,显示光标的位置,放置在按钮8后面
        lab1.resize(20, 30)


        le1.setCursorPosition(int(len(le1.text())/2))           # 设置光标位置
        print(le1.cursorPosition())                             # 获取光标位置

        def forward_move():
            le1.cursorForward(True, 5)     # 光标向前(右)移动5个字符,并选中文本内容
            # le1.cursorForward(False, 5)     # 光标向前(右)移动5个字符,不选中文本内容
            le1.setFocus()  # 设置le1获取焦点

        def backward_move():
            le1.cursorBackward(True, 3)     # 光标向后(左)移动3个字符,并选中文本内容
            # le1.cursorBackward(False, 3)     # 光标向后(左)移动3个字符,不选中文本内容
            le1.setFocus()  # 设置le1获取焦点

        def wordforward_move():
            le1.cursorWordForward(True)     # 光标向前(右)移动一个单词(下一个空格之前),并选中文本内容
            # le1.cursorWordForward(False)     # 光标向前(右)移动一个单词(下一个空格之前),不选中文本内容
            le1.setFocus()  # 设置le1获取焦点

        def wordbackward_move():
            le1.cursorWordBackward(True)    # 光标向后(左)移动一个单词(下一个空格之后),并选中文本内容
            # le1.cursorWordBackward(False)   # 光标向后(左)移动一个单词(下一个空格之后),不选中文本内容
            le1.setFocus()  # 设置le1获取焦点

        def home_move():
            le1.home(True)                  # 光标移动到行首,并选中文本
            # le1.home(False)                  # 光标移动到行首,不选中文本
            le1.setFocus()  # 设置le1获取焦点

        def end_move():
            le1.end(True)                   # 光标移动到行尾,并选中文本
            # le1.end(False)                   # 光标移动到行尾,不选中文本
            le1.setFocus()                   # 设置le1获取焦点

        def cursor_move():
            print(le2.text())
            le1.setCursorPosition(int(le2.text()))
            le1.setFocus()

        def xy_move():
            print(str(le3.cursorPositionAt(QPoint(110, 25))))
            lab1.setText(str(le3.cursorPositionAt(QPoint(110, 25))))


        btn1 = QPushButton('向前(右)移5个字符',self)
        btn2 = QPushButton('向后(左)移3个字符',self)
        btn3 = QPushButton('向前(右)移一个单词',self)
        btn4 = QPushButton('向后(左)移一个单词',self)
        btn5 = QPushButton('移到行首',self)
        btn6 = QPushButton('移到行尾',self)
        btn7 = QPushButton('指定位置移到',self)
        btn8 = QPushButton('根据坐标(110, 25)移动',self)

        btn1.move(100, 150)
        btn2.move(250, 150)

        btn3.move(100, 200)
        btn4.move(250, 200)

        btn5.move(100, 250)
        btn6.move(250, 250)


        btn7.move(100, 300)
        le2.move(250, 300)

        btn8.move(100, 350)
        lab1.move(300, 350)

        btn1.clicked.connect(forward_move)
        btn2.clicked.connect(backward_move)
        btn3.clicked.connect(wordforward_move)
        btn4.clicked.connect(wordbackward_move)
        btn5.clicked.connect(home_move)
        btn6.clicked.connect(end_move)
        btn7.clicked.connect(cursor_move)
        btn8.clicked.connect(xy_move)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Windows()

    window.show()
    sys.exit(app.exec_())

  • 示例10:QLineEdit-文本内容边距设置
from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)
window = QWidget()
window.resize(1000, 300)
window.setWindowTitle('QLineEdit-文本边距设置')
x = 40
y = 70
d = 20
# ****************默认显示控件****************** 开始
le1 = QLineEdit(window)
le1.resize(300, 100)
le1.move(x, y)
le1.setText('QLineEdit-文本边距设置')

lab1 = QLabel(window)
lab1.setText('QLabel-边距设置')
lab1.setStyleSheet('background-color: cyan;')
lab1.resize(300, 100)
lab1.move(x, y + le1.height() + d)

# ****************默认显示控件****************** 结束

# ****************setContentsMargins****************** 开始
le2 = QLineEdit(window)
le2.resize(300, 100)
le2.move(le1.x() + le1.width() + d, le1.y())
le2.setText('QLineEdit-文本边距设置')
le2.setContentsMargins(100, 20, 0, 0)

lab2 = QLabel(window)
lab2.setText('QLabel-边距设置')
lab2.setStyleSheet('background-color: cyan;')
lab2.resize(300, 100)
lab2.move(lab1.x() + lab1.width() + d, lab1.y())
lab2.setContentsMargins(100, 20, 0, 0)

# ****************setContentsMargins****************** 结束

# ****************setTextMargins****************** 开始
le3 = QLineEdit(window)
le3.resize(300, 100)
le3.move(le2.x() + le2.width() + d, le1.y())
le3.setText('QLineEdit-文本边距设置')
le3.setTextMargins(100, 20, 0, 0)

lab3 = QLabel(window)
lab3.setText(f'QLabel-边距设置\nQLabel没有setTextMargins方法')
lab3.setStyleSheet('background-color: cyan;')
lab3.resize(300, 100)
lab3.move(lab2.x() + lab2.width() + d, lab1.y())


# ****************setTextMargins****************** 结束

# ****************说明标签控件****************** 开始
lab4 = QLabel('默认显示', window)
lab4.move(le1.x(), le1.y() - 30)

lab5 = QLabel('setContentsMargins(100, 20, 0, 0)', window)
lab5.move(le2.x(), le2.y() - 30)

lab6 = QLabel('setTextMargins(100, 20, 0, 0)', window)
lab6.move(le3.x(), le3.y() - 30)
# ****************说明标签控件****************** 结束

lab7 = QLabel('测试',window)
lab7.move(le2.x(), le2.y())

print(le3.getTextMargins())
print(type(le3.getTextMargins()))
window.show()
sys.exit(app.exec_())

  • 示例11:QLineEdit-文本内容对其方式
from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)
window = QWidget()
window.resize(550, 550)
window.setWindowTitle('QLineEdit-文本内容对齐方式')

le = QLineEdit(window)
le.resize(300, 300)
le.move(100, 50)
le.setText('QLineEdit-文本内容对齐方式')

btn_h1 = QPushButton('水平居左', window)
btn_h2 = QPushButton('水平居右', window)
btn_h3 = QPushButton('水平居中', window)
btn_h4 = QPushButton('水平两端对齐', window)

btn_v1 = QPushButton('垂直居上', window)
btn_v2 = QPushButton('垂直居下', window)
btn_v3 = QPushButton('垂直居中', window)
btn_v4 = QPushButton('与基线对齐', window)

btn_5 = QPushButton("垂直水平居中", window)
btn_6 = QPushButton("垂直居上水平居左", window)

btn_ls = [btn_h1, btn_h2, btn_h3, btn_h4]
for btn in btn_ls:
    btn.move(int(100 * (btn_ls.index(btn)+1)), 400)

btn_ls = [btn_v1, btn_v2, btn_v3, btn_v4]
for btn in btn_ls:
    btn.move(int(100 * (btn_ls.index(btn)+1)), 450)

btn_5.move(100, 500)
btn_6.move(250, 500)
"""
setAlignment(Qt.Alignment)              # 设置文本内容对其方式
# 水平方向
    Qt.AlignLeft                # 水平居左
    Qt.AlignRight               # 水平居右
    Qt.AlignHCenter             # 水平居中
    Qt.AlignJustify             # 水平方向调整间距两端对齐
# 垂直方向
    Qt.AlignTop                 # 垂直居上
    Qt.AlignBottom              # 垂直居下
    Qt.AlignVCenter             # 垂直居中
    Qt.AlignBaseline            # 垂直方向与基线对齐
Qt.AlignCenter                  # 垂直和水平都居中,相当于Qt.AlignHCenter | Qt.AlignVCenter
"""

def alignment_hv():
    # 设置文本内容垂直居上并且水平居左
    le.setAlignment(Qt.AlignTop | Qt.AlignLeft)

btn_h1.clicked.connect(lambda : le.setAlignment(Qt.AlignLeft))
btn_h2.clicked.connect(lambda : le.setAlignment(Qt.AlignRight))
btn_h3.clicked.connect(lambda : le.setAlignment(Qt.AlignHCenter))
btn_h4.clicked.connect(lambda : le.setAlignment(Qt.AlignJustify))

btn_v1.clicked.connect(lambda : le.setAlignment(Qt.AlignTop))
btn_v2.clicked.connect(lambda : le.setAlignment(Qt.AlignBottom))
btn_v3.clicked.connect(lambda : le.setAlignment(Qt.AlignVCenter))
btn_v4.clicked.connect(lambda : le.setAlignment(Qt.AlignBaseline))

btn_5.clicked.connect(lambda :le.setAlignment(Qt.AlignCenter))
btn_6.clicked.connect(alignment_hv)

window.show()
sys.exit(app.exec_())

  • 示例12:QLineEdit-