QLineEdit 是 Qt 框架中用于单行文本输入的核心控件,广泛应用于表单输入、搜索框、命令行交互等场景。它提供了丰富的文本处理功能、输入验证机制和交互特性,是 Qt 界面开发中不可或缺的组件。本文将从基础用法、高级特性、信号与槽、输入验证、样式定制等方面全面解析 QLineEdit 的使用方法。
一、基础用法
创建与初始化
在 C++ 中使用 QLineEdit 需包含头文件 ,并通过构造函数创建实例。基本语法如下:
<QLineEdit>
#include <QLineEdit>
// 构造函数:父对象指针可选,用于内存管理
QLineEdit *lineEdit = new QLineEdit(parent);
可通过构造函数直接设置初始文本:
QLineEdit *lineEdit = new QLineEdit("初始文本", parent);
文本设置与获取
设置文本:
setText(const QString &text)
lineEdit->setText("Hello Qt");
获取文本:
QString text() const
QString input = lineEdit->text();
追加文本:(在光标位置插入)
insert(const QString &text)
lineEdit->insert(" World"); // 原文本为"Hello"时,结果为"Hello World"
基本属性控制
只读模式:
setReadOnly(bool)
lineEdit->setReadOnly(true); // 文本可选中但不可编辑
清空文本:
clear()
lineEdit->clear();
占位提示文本:(未输入时显示灰色提示)
setPlaceholderText(const QString &text)
lineEdit->setPlaceholderText("请输入用户名");
最大长度限制:
setMaxLength(int length)
lineEdit->setMaxLength(20); // 最多输入20个字符
二、输入模式与显示格式
QLineEdit 支持多种输入模式,通过 控制文本显示方式,适用于密码输入等场景:
setEchoMode(EchoMode mode)
:默认模式,输入即显示(如普通文本)。
QLineEdit::Normal:输入字符显示为占位符(如
QLineEdit::Password),实际文本可通过
• 获取。
text():输入时显示明文,失去焦点后转为密码模式。
QLineEdit::PasswordEchoOnEdit:不显示任何输入(如敏感信息)。
QLineEdit::NoEcho
示例:
// 密码输入框
QLineEdit *passwordEdit = new QLineEdit(parent);
passwordEdit->setEchoMode(QLineEdit::Password);
passwordEdit->setPlaceholderText("请输入密码");
三、信号与槽机制
QLineEdit 提供了丰富的信号,用于响应文本变化、焦点切换等事件,常用信号如下:
文本变化相关
:文本发生改变时触发(包括编程修改)。
textChanged(const QString &text)
connect(lineEdit, &QLineEdit::textChanged, this, [=](const QString &text) {
qDebug() << "当前文本:" << text;
});
:仅用户手动编辑导致文本变化时触发(排除
textEdited(const QString &text) 等编程修改)。
setText()
焦点与交互相关
:用户按下回车键时触发(常用于提交表单)。
returnPressed()
connect(lineEdit, &QLineEdit::returnPressed, this, &MyWidget::onSubmit);
:编辑完成且失去焦点时触发(如用户点击其他控件)。
editingFinished()
四、输入验证
QLineEdit 可通过验证器(Validator)限制输入格式,确保输入符合预期(如数字、邮箱、IP地址等)。Qt 提供了三种内置验证器:
QIntValidator:限制整数输入(支持范围设定)
#include <QIntValidator>
QIntValidator *intValidator = new QIntValidator(1, 100, this); // 1~100的整数
lineEdit->setValidator(intValidator);
QDoubleValidator:限制浮点数输入(支持范围和精度)
#include <QDoubleValidator>
// -100.0~100.0,精度2位小数
QDoubleValidator *doubleValidator = new QDoubleValidator(-100.0, 100.0, 2, this);
doubleValidator->setNotation(QDoubleValidator::StandardNotation); // 标准表示法(非科学计数)
lineEdit->setValidator(doubleValidator);
QRegExpValidator:通过正则表达式验证(灵活适配复杂格式)
示例:验证邮箱格式
#include <QRegExpValidator>
QRegExp emailRegExp("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}");
QRegExpValidator *emailValidator = new QRegExpValidator(emailRegExp, this);
lineEdit->setValidator(emailValidator);
自定义验证器
若内置验证器不满足需求,可继承 重写
QValidator 方法实现自定义逻辑:
validate()
class CustomValidator : public QValidator {
public:
State validate(QString &input, int &pos) const override {
// 自定义验证逻辑,返回 Acceptable/Intermediate/Invalid
if (input.contains("invalid")) return Invalid;
return Acceptable;
}
};
// 使用
lineEdit->setValidator(new CustomValidator(this));
五、上下文菜单与功能扩展
QLineEdit 默认提供右键上下文菜单(包含复制、粘贴、撤销等功能),可通过以下方法扩展或定制:
内置功能控制
撤销/重做:、
undo()复制/粘贴:
redo()、
copy()剪切:
paste()全选:
cut()
selectAll()
示例:按钮触发全选
connect(selectAllBtn, &QPushButton::clicked, lineEdit, &QLineEdit::selectAll);
自定义上下文菜单
通过重写 或使用
contextMenuEvent(QContextMenuEvent *event) 替换默认菜单:
setContextMenuPolicy()
QMenu *menu = lineEdit->createStandardContextMenu(); // 获取默认菜单
menu->addAction("自定义操作", this, &MyWidget::customAction);
menu->exec(event->globalPos()); // 显示菜单
六、样式定制
QLineEdit 支持通过 Qt Style Sheets(QSS)定制外观,常见样式设置如下:
基本样式
lineEdit->setStyleSheet(R"(
QLineEdit {
border: 2px solid #ccc; /* 边框 */
border-radius: 4px; /* 圆角 */
padding: 5px; /* 内边距 */
font-size: 14px; /* 字体大小 */
color: #333; /* 文本颜色 */
background-color: #fff; /* 背景色 */
}
QLineEdit:focus { /* 获焦状态 */
border-color: #4a90e2;
outline: none;
}
QLineEdit:read-only { /* 只读状态 */
background-color: #f5f5f5;
color: #999;
}
)");
占位文本样式
通过 伪元素定制提示文本样式:
::placeholder
QLineEdit::placeholder {
color: #999;
font-style: italic;
}
七、高级特性
输入掩码(Input Mask)
用于固定格式输入(如电话号码、日期),通过 实现。掩码字符规则:
setInputMask(const QString &mask)
:必须输入数字(0-9)
0:可选输入数字或空格
9:必须输入字母(A-Z,a-z)
A:可选输入字母或空格
a:空格占位符
_
示例:设置电话号码掩码(如 138-1234-5678)
lineEdit->setInputMask("000-0000-0000;_"); // 分号后为占位符
自动补全
结合 实现输入提示功能:
QCompleter
#include <QCompleter>
QStringList wordList = {"Apple", "Banana", "Cherry", "Date"};
QCompleter *completer = new QCompleter(wordList, this);
completer->setCaseSensitivity(Qt::CaseInsensitive); // 不区分大小写
lineEdit->setCompleter(completer);
与其他控件联动
QLineEdit 常与 (提交)、
QPushButton(提示)等控件配合使用,例如实现搜索功能:
QLabel
// 搜索按钮点击时触发搜索
connect(searchBtn, &QPushButton::clicked, this, [=]() {
QString keyword = lineEdit->text();
if (!keyword.isEmpty()) {
search(keyword); // 自定义搜索函数
}
});
// 回车触发搜索
connect(lineEdit, &QLineEdit::returnPressed, searchBtn, &QPushButton::click);
八、常见问题与解决方案
文本为空判断
使用 或
text().isEmpty() 检查输入是否为空:
text().isNull()
if (lineEdit->text().isEmpty()) {
QMessageBox::warning(this, "提示", "输入不能为空!");
}
限制输入空格
通过 信号过滤空格:
textChanged
connect(lineEdit, &QLineEdit::textChanged, this, [=](const QString &text) {
if (text.contains(" ")) {
lineEdit->setText(text.replace(" ", "")); // 移除空格
}
});
获取光标位置与选中文本
光标位置:选中文本:
cursorPosition()
selectedText()
QString selected = lineEdit->selectedText();
int cursorPos = lineEdit->cursorPosition();
总结
QLineEdit 作为 Qt 中最常用的输入控件,其功能涵盖了从基础文本输入到复杂格式验证的全场景需求。通过灵活运用其信号与槽、验证器、样式定制等特性,可快速实现用户友好的输入交互。在实际开发中,需结合具体业务场景(如表单验证、搜索功能等)选择合适的配置,同时注意通过样式设计提升用户体验。掌握 QLineEdit 的使用,是 Qt 界面开发的基础技能之一。

