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

两者可以同时使用。


相关推荐
C++ 老炮儿的技术栈12 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
我不是疯子是傻子16 小时前
Qt 实时曲线卡顿优化:从QPainter到OpenGL的3级加速实战
开发语言·qt
秋田君17 小时前
QT_XML文件操作
xml·数据库·qt
我不是疯子是傻子18 小时前
串口通信数据帧粘包拆包再进化:基于 Qt 的滑动窗口与 CRC 校验实战
开发语言·qt
程序员老陆18 小时前
Qt中实现窗口真全屏(覆盖Windows任务栏)
开发语言·windows·qt
艾莉丝努力练剑1 天前
【QT:解决问题】Qt5Core.dll:无法定位程序输入点
java·开发语言·qt·学习·面试
秋田君2 天前
QT_JSON文件操作
开发语言·qt·json
大白同学4212 天前
初识Qt——信号和槽
开发语言·qt
秋田君2 天前
QT_INI文件操作
开发语言·qt
≮傷£≯√2 天前
FFmpeg + qt 音频播放
qt·ffmpeg·音视频