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

两者可以同时使用。


相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能16 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G16 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt