Qt 输入框:限制输入 + 不限制输入 + 数字/浮点/十六进制完整解析指南
内容结构清晰、代码可直接用,你可以复制到你的博客里。
Qt 输入框 QLineEdit 数字输入处理教程
支持:整数、浮点、十六进制(限制输入 / 不限制输入两种方式)
在 Qt 项目中,输入框常用于填写参数,例如端口号、地址、数值、十六进制字节等。如何让输入既方便用户,又不出错,是很常见的问题。
这篇教程将通过实际代码告诉你:
- 如何在输入时就限制格式(只允许输入合法字符)
- 如何在不限制输入的情况下进行手动校验
- 如何解析整数、浮点数、十六进制
- 如何把十六进制字符串转成
QByteArray
无论你是做工具界面、通信界面、协议调试器,都能用上。
一、限制输入:使用 Validator(推荐)
这种方式是在初始化 UI 时,就把输入框的合法格式设定好。
用户无法输入非法字符,体验更友好。
一般写在 MainWindow 构造函数中:
cpp
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 1. 整数:范围 0~65535
ui->lineEditInt->setValidator(new QIntValidator(0, 65535, this));
// 2. 浮点数:范围 0~999.99,最多 2 位小数
QDoubleValidator *dv = new QDoubleValidator(0, 999.99, 2, this);
dv->setNotation(QDoubleValidator::StandardNotation);
ui->lineEditDouble->setValidator(dv);
// 3. 十六进制:允许 0-9 A-F a-f 和空格
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
QRegularExpression rx("[0-9A-Fa-f ]+");
ui->lineEditHex->setValidator(new QRegularExpressionValidator(rx, this));
#else
QRegExp rx("[0-9A-Fa-f ]+");
ui->lineEditHex->setValidator(new QRegExpValidator(rx, this));
#endif
}
这种方法的特点:
- 用户输入过程中自动过滤错误字符
- 如果格式严重不对,根本输入不进去
- 不影响你在提交时进行业务校验(比如范围检查)
非常适合"字段明确、有格式"的场景。
二、不限制输入:回车 / 点击按钮时手动解析
有些场景你想让用户自由输入(包括空字符串、错误内容等),然后在提交时再判断是否有效。
常见触发方式:
- 用户按回车
QLineEdit::returnPressed - 点击按钮
QPushButton::clicked
绑定信号:
cpp
connect(ui->lineEditInt, &QLineEdit::returnPressed,
this, &MainWindow::parseInt);
connect(ui->btnParse, &QPushButton::clicked,
this, &MainWindow::parseAll);
下面分类型讲解析。
三、解析整数(十进制)
cpp
void MainWindow::parseInt()
{
QString text = ui->lineEditInt->text().trimmed();
bool ok = false;
int value = text.toInt(&ok); // 默认十进制
if (!ok) {
QMessageBox::warning(this, "错误", "请输入有效的整数");
return;
}
ui->textEditLog->append(QString("解析到整数:%1").arg(value));
}
特点:
- 会过滤掉
12a、abc这种错误输入 - 转换失败时提示用户
四、解析浮点数
cpp
void MainWindow::parseDouble()
{
QString text = ui->lineEditDouble->text().trimmed();
bool ok = false;
double value = text.toDouble(&ok);
if (!ok) {
QMessageBox::warning(this, "错误", "请输入有效的浮点数");
return;
}
ui->textEditLog->append(QString("解析到浮点数:%1").arg(value));
}
五、解析十六进制(单个值)
cpp
void MainWindow::parseHexSingle()
{
QString text = ui->lineEditHex->text().trimmed();
bool ok = false;
int value = text.toInt(&ok, 16); // base=16
if (!ok) {
QMessageBox::warning(this, "错误", "请输入合法十六进制数(如 FF 或 1A)");
return;
}
ui->textEditLog->append(
QString("解析成功:0x%1 (%2)").arg(value, 0, 16).arg(value)
);
}
六、解析十六进制为字节数组(协议常用)
输入格式示例:
0A FF 12 34
解析:
cpp
void MainWindow::parseHexBytes()
{
QString text = ui->lineEditHex->text().trimmed();
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
QStringList parts = text.split(QRegularExpression("\\s+"), Qt::SkipEmptyParts);
#else
QStringList parts = text.split(QRegExp("\\s+"), Qt::SkipEmptyParts);
#endif
QByteArray bytes;
for (const QString &p : parts) {
bool ok = false;
int value = p.toInt(&ok, 16);
if (!ok || value < 0 || value > 255) {
QMessageBox::warning(this, "错误",
QString("无效字节:'%1'").arg(p));
return;
}
bytes.append(static_cast<char>(value));
}
ui->textEditLog->append(
QString("成功解析 %1 个字节").arg(bytes.size())
);
}
这是通信协议开发中最常用的功能之一。
七、何时使用限制 / 不限制?
| 使用时机 | 推荐方式 |
|---|---|
| 输入明确、可预知,例如端口号、地址、十六进制字节 | 初始化时加 Validator |
| 输入允许各种格式,例如用户可能输错、不同格式混用 | 不限制,回车/按钮后手动解析 |
| 对 UI 体验要求高、希望用户没机会输错 | 优先使用 Validator |
一般来说:
- Validator 用于"格式限定"
- 提交时解析用于"业务验证"
两者可以同时使用。