4. QLineEdit 输入与校验

任务目标

实现一个包含QLineEdit输入框的Qt窗口,使用QValidator(正则表达式验证器)限制输入内容为数字(含整数和小数),并在输入过程中实时显示校验结果(合法/非法)。

环境依赖

  • Qt 5.15+(或Qt 6.x)
  • 编译器:支持C++11或更高版本
  • 构建工具:qmake或CMake(本案例使用qmake)

完整实现

创建一个QWidget窗口,包含一个QLineEdit用于输入,一个QLabel用于显示校验状态。使用QRegularExpressionValidator限制输入为数字(支持正负号和小数点),并通过textChanged信号实时判断当前输入是否合法。

// main.cpp
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QLabel>
#include <QRegularExpressionValidator>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget window;
    window.setWindowTitle("QLineEdit 数字输入校验");

    QVBoxLayout *layout = new QVBoxLayout(&window);

    QLineEdit *lineEdit = new QLineEdit;
    lineEdit->setPlaceholderText("请输入数字(支持小数和负数)");

    // 正则:可选正负号 + 整数部分 + 可选小数部分
    QRegularExpression regex("^-?\\d+(\\.\\d+)?$");
    QRegularExpressionValidator *validator = new QRegularExpressionValidator(regex, lineEdit);
    lineEdit->setValidator(validator);

    QLabel *statusLabel = new QLabel("等待输入");
    statusLabel->setStyleSheet("font-weight: bold;");

    layout->addWidget(lineEdit);
    layout->addWidget(statusLabel);

    // 实时校验:输入变化时判断当前文本是否完全匹配正则
    QObject::connect(lineEdit, &QLineEdit::textChanged, [&](const QString &text) {
        QRegularExpression fullMatch("^-?\\d+(\\.\\d+)?$");
        if (text.isEmpty()) {
            statusLabel->setText("等待输入");
            statusLabel->setStyleSheet("color: gray; font-weight: bold;");
        } else if (fullMatch.match(text).hasMatch()) {
            statusLabel->setText("✓ 合法数字");
            statusLabel->setStyleSheet("color: green; font-weight: bold;");
        } else {
            statusLabel->setText("✗ 非法输入(仅允许数字、小数点、负号)");
            statusLabel->setStyleSheet("color: red; font-weight: bold;");
        }
    });

    window.resize(400, 120);
    window.show();

    return app.exec();
}

工程文件

# ValidatorDemo.pro
QT += core gui widgets
TARGET = ValidatorDemo
TEMPLATE = app
SOURCES += main.cpp

运行方式

qmake ValidatorDemo.pro
make
./ValidatorDemo   # Windows下为 ValidatorDemo.exe

验证方法

  • 合法输入:输入 123、-45.6、0.5,状态标签显示绿色“✓ 合法数字”。
  • 非法输入:输入 abc、12a、3.4.5,状态标签显示红色“✗ 非法输入”。
  • 边界行为:由于设置了validator,非法字符(如字母)会被直接阻止输入;但像 12a 这类中间状态(先输入12再输入a)中,a会被拦截,因此实际无法形成非法文本。若想观察非法状态,可输入 - 或 . 开头的临时状态(如单独输入 -),此时正则不匹配,标签显示红色提示。

通过标准:程序可编译运行;输入框只能输入数字、负号和小数点;当输入内容符合数字格式时显示绿色合法提示,否则显示红色非法提示。