介绍
QLineEdit 是 PySide2 中最基础且常用的 单行文本输入 控件,主打 “轻量快捷”,适用于 账号、密码、搜索关键词 等短文本输入场景。本文将从基础用法、进阶功能、实战案例三个维度,系统讲解其使用方法。
基础用法
创建 QLineEdit 并设置提示文本、初始内容,是最基础的用法:
from PySide2.QtWidgets import QApplication, QLineEdit, QWidget, QVBoxLayout
import sys
app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout(window)
# 1. 创建默认 QLineEdit
edit1 = QLineEdit()
edit1.setPlaceholderText("请输入基础文本(如用户名)") # 输入提示(未输入时显示)
edit1.setText("默认用户名") # 设置初始文本
# 2. 获取文本内容(通常在按钮点击、回车触发时调用)
def get_text():
print("输入的内容:", edit1.text()) # 输出:输入的内容:默认用户名(或用户输入的文本)
# 绑定回车触发事件(按下 Enter 时执行 get_text)
edit1.returnPressed.connect(get_text)
layout.addWidget(edit1)
window.show()
sys.exit(app.exec_())
核心文本操作方法
setText(str)
设置控件的文本内容
edit.setText("hello")
text()
获取当前输入的文本内容
content = edit.text()
clear()
清空文本内容
edit.clear()
setPlaceholderText(str)
设置输入提示文本(未输入时显示,输入后消失)
edit.setPlaceholderText("请输入")
selectAll()
全选当前文本
edit.selectAll()
输入限制:控制文本长度与格式
限制输入长度
通过 setMaxLength(int) 限制文本最大字符数,适合手机号、验证码等固定长度场景:
# 限制输入长度为 11(如手机号)
phone_edit = QLineEdit()
phone_edit.setPlaceholderText("请输入手机号(11位)")
phone_edit.setMaxLength(11) # 最多输入 11 个字符,超出部分无法输入
layout.addWidget(phone_edit)
限制输入格式(输入掩码)
通过 setInputMask(str) 强制文本按固定格式输入(如日期、身份证、IP 地址),格式字符对应规则如下:
| 格式字符 | 含义 | 示例场景 |
|---|---|---|
| 0 | 必须输入数字(0-9) | 手机号、日期中的年份 |
| 9 | 可选输入数字(0-9) | 电话号码中的分机号 |
| A | 必须输入字母(A-Z,a-z) | 身份证中的字母(如 X) |
| a | 可选输入字母(A-Z,a-z) | 可选的字母输入 |
-/_/. |
固定显示的分隔符 | 日期中的 -、IP 中的 . |
示例:实现日期格式输入(YYYY-MM-DD)
date_edit = QLineEdit()
# 输入掩码:4个必须数字(年)-2个必须数字(月)-2个必须数字(日)
date_edit.setInputMask("0000-00-00")
date_edit.setPlaceholderText("请输入日期(YYYY-MM-DD)")
layout.addWidget(date_edit)
# 输入时会自动显示分隔符“-”,且仅允许在对应位置输入数字
进阶功能:样式、模式与交互
密码输入模式(EchoMode)
QLineEdit 独有的 EchoMode 属性,支持四种输入显示模式,其中 密码隐藏模式 是最常用的进阶功能:
| 模式常量 | 功能描述 | 适用场景 |
|---|---|---|
| QLineEdit.Normal | 正常显示输入内容(默认) | 普通文本输入(如用户名) |
| QLineEdit.Password | 输入内容隐藏为 * |
密码输入 |
| QLineEdit.PasswordEchoOnEdit | 输入时显示明文,失去焦点后隐藏为 * |
敏感信息输入(兼顾便捷与安全) |
| QLineEdit.NoEcho | 完全不显示输入内容(连 * 都没有) |
极高安全要求的场景(如支付密码) |
示例:密码输入与切换显示
from PySide2.QtWidgets import QCheckBox
# 密码输入框
pwd_edit = QLineEdit()
pwd_edit.setPlaceholderText("请输入密码")
pwd_edit.setEchoMode(QLineEdit.Password) # 默认隐藏为“*”
# 密码显示切换复选框
show_pwd_box = QCheckBox("显示密码")
def toggle_pwd_visible(state):
# 复选框勾选时,切换为输入时显示明文;未勾选时,隐藏为“*”
if state == 2: # Qt.CheckState.Checked 对应值为 2
pwd_edit.setEchoMode(QLineEdit.PasswordEchoOnEdit)
else:
pwd_edit.setEchoMode(QLineEdit.Password)
show_pwd_box.stateChanged.connect(toggle_pwd_visible)
layout.addWidget(pwd_edit)
layout.addWidget(show_pwd_box)
样式定制:美化外观
通过 setStyleSheet(str) 用 CSS 语法定制控件样式,支持修改背景色、边框、字体、选中状态等,满足界面美化需求:
# 定制带圆角、蓝色边框的 QLineEdit
styled_edit = QLineEdit()
styled_edit.setPlaceholderText("美化后的输入框")
styled_edit.setStyleSheet("""
QLineEdit {
border: 2px solid #4A90E2; /* 边框:2px 蓝色 */
border-radius: 8px; /* 圆角:8px */
padding: 6px 12px; /* 内边距:上下 6px,左右 12px(避免文本贴边) */
font-size: 14px; /* 字体大小:14px */
color: #333333; /* 文本颜色:深灰色 */
background-color: #F8F9FA; /* 背景色:浅灰色 */
}
QLineEdit:focus {
border-color: #2563EB; /* 获焦时边框颜色:深蓝色(突出交互) */
outline: none; /* 清除默认获焦外框(避免重复边框) */
}
QLineEdit:disabled {
background-color: #E9ECEF; /* 禁用时背景色:更浅的灰色 */
color: #ADB5BD; /* 禁用时文本颜色:浅灰色 */
}
""")
layout.addWidget(styled_edit)
# 禁用状态示例(按需开启)
# styled_edit.setDisabled(True)
状态控制:启用 / 禁用与只读
启用 / 禁用控件
通过 setEnabled(bool) 控制控件是否可交互,禁用后无法输入、无法获焦,适合 “条件触发输入” 场景(如勾选同意协议后才允许输入手机号):
# 同意协议复选框
agree_box = QCheckBox("我已阅读并同意用户协议")
# 手机号输入框(默认禁用)
phone_edit = QLineEdit()
phone_edit.setPlaceholderText("请输入手机号")
phone_edit.setEnabled(False)
# 勾选协议后启用手机号输入
def toggle_phone_edit(state):
phone_edit.setEnabled(state == 2) # 勾选时启用,未勾选时禁用
agree_box.stateChanged.connect(toggle_phone_edit)
layout.addWidget(agree_box)
layout.addWidget(phone_edit)
只读模式
通过 setReadOnly(bool) 设置控件为只读状态,此时文本可选中、可复制,但无法修改,适合 “展示不可编辑的文本” 场景(如订单号、用户 ID):
# 只读的订单号显示
order_edit = QLineEdit()
order_edit.setText("ORDER20251001001") # 固定文本,用户无法修改
order_edit.setReadOnly(True) # 设为只读
layout.addWidget(order_edit)
实战案例:QLineEdit 典型应用场景
- 登录表单(账号 + 密码)
结合 QLineEdit 的密码模式、输入限制,实现一个简易登录表单:
from PySide2.QtWidgets import QPushButton, QHBoxLayout
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("简易登录")
layout = QVBoxLayout(window)
# 1. 账号输入(限制长度 20)
account_edit = QLineEdit()
account_edit.setPlaceholderText("请输入账号(最长20位)")
account_edit.setMaxLength(20)
layout.addWidget(account_edit)
# 2. 密码输入(隐藏模式+显示切换)
pwd_edit = QLineEdit()
pwd_edit.setPlaceholderText("请输入密码")
pwd_edit.setEchoMode(QLineEdit.Password)
# 密码显示切换复选框(横向布局)
pwd_layout = QHBoxLayout()
show_pwd_box = QCheckBox("显示密码")
show_pwd_box.stateChanged.connect(lambda s: pwd_edit.setEchoMode(
QLineEdit.PasswordEchoOnEdit if s == 2 else QLineEdit.Password
))
pwd_layout.addWidget(pwd_edit)
pwd_layout.addWidget(show_pwd_box)
layout.addLayout(pwd_layout)
# 3. 登录按钮(点击时验证输入)
def login():
account = account_edit.text().strip()
pwd = pwd_edit.text().strip()
if not account:
print("请输入账号")
return
if not pwd:
print("请输入密码")
return
print(f"登录请求:账号={account},密码={pwd}") # 实际项目中会替换为接口请求
login_btn = QPushButton("登录")
login_btn.clicked.connect(login)
# 回车触发登录(账号或密码框按下 Enter 时)
account_edit.returnPressed.connect(login)
pwd_edit.returnPressed.connect(login)
layout.addWidget(login_btn)
window.show()
sys.exit(app.exec_())
搜索框(实时搜索 / 回车搜索)
结合 textChanged 信号实现实时搜索,或 returnPressed 实现回车搜索,适用于搜索功能:
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("简易搜索")
layout = QVBoxLayout(window)
# 搜索框
search_edit = QLineEdit()
search_edit.setPlaceholderText("请输入搜索关键词(实时搜索/按 Enter 搜索)")
# 搜索图标(可选,用样式模拟)
search_edit.setStyleSheet("""
QLineEdit {
padding-left: 30px; /* 左侧留空间放图标 */
background-image: url(:/icons/search.png); /* 实际项目需导入图标资源 */
background-repeat: no-repeat;
background-position: left 8px center;
background-size: 16px 16px;
}
""")
# 1. 实时搜索(文本变化时触发,适合短关键词)
def realtime_search(text):
print(f"实时搜索:{text}") # 实际项目中会替换为筛选列表、接口请求等
search_edit.textChanged.connect(realtime_search)
# 2. 回车搜索(避免实时搜索频繁触发,适合长关键词)
def enter_search():
text = search_edit.text().strip()
print(f"回车搜索:{text}")
search_edit.returnPressed.connect(enter_search)
layout.addWidget(search_edit)
window.show()
sys.exit(app.exec_())
常见问题与解决方案
问题:按下 Enter 键无法触发 returnPressed 信号
原因:控件未获焦(焦点在其他控件上),或信号未正确绑定。
解决方案:
- 确保信号绑定代码正确(如
edit.returnPressed.connect(func)); - 可通过
edit.setFocus()让控件默认获焦(如登录表单中,默认聚焦账号输入框):
# 登录表单中,窗口显示时默认聚焦账号输入框
window.showEvent = lambda e: account_edit.setFocus()
问题:输入掩码无法满足复杂格式需求(如邮箱)
原因:setInputMask 仅支持固定格式,邮箱、URL 等动态格式无法覆盖。
解决方案:使用 QRegExpValidator 或 QIntValidator 进行正则验证:
from PySide2.QtGui import QRegExpValidator, QRegExp
# 邮箱输入验证(正则表达式)
email_edit = QLineEdit()
email_edit.setPlaceholderText("请输入邮箱")
# 邮箱正则(简化版):xxx@xxx.xxx
email_reg = QRegExp(r"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$")
email_validator = QRegExpValidator(email_reg)
email_edit.setValidator(email_validator) # 仅允许输入符合邮箱格式的文本
layout.addWidget(email_edit)
问题:控件样式在不同系统中显示不一致
原因:QLineEdit 默认样式依赖系统主题,Windows、macOS 显示效果不同。
解决方案:通过完整的 CSS 样式覆盖默认样式,确保跨系统一致性(参考 “进阶功能 2:样式定制” 中的示例,明确设置边框、背景、字体等属性)。
