Qt 输入框: 数字/浮点/十六进制数值输入处理

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));
}

特点:

  • 会过滤掉 12aabc 这种错误输入
  • 转换失败时提示用户

四、解析浮点数

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 用于"格式限定"
  • 提交时解析用于"业务验证"

两者可以同时使用。


相关推荐
神仙别闹6 小时前
基于QT(C++)实现宠物小精灵对战游戏
c++·qt·宠物
小尧嵌入式6 小时前
音视频入门基础知识
开发语言·c++·qt·算法·音视频
蓑衣夜行7 小时前
QtWebEngine 自动重启方案
开发语言·c++·qt·web·qwebengine
Source.Liu7 小时前
【LibreCAD】点实体源码解析
c++·qt·cad
乌托邦2号7 小时前
Qt5之中文字符串转换
开发语言·qt
IOT-Power8 小时前
QT QSerialPort 串口不稳定,串口是否使用独立线程
qt
IOT-Power8 小时前
QT的解耦方式
qt
定义小花10 小时前
c++ cmake qt
开发语言·c++·qt
cn_newer10 小时前
Qt的applicationName的使用TARGET作为默认值会截断
qt