关于QDoubleValidator增加上下限无效的解决

本文介绍了一种在Qt中自定义QDoubleValidator的方法,通过重载基类validator,实现了对输入范围从10.0到1000.0且小数点后仅允许一位的精确控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般设置QDoubleValidator是不生效的,因为QT是依据每次输入都要判定一次,所以这时候需要针对基类的validator重新实现,下面是判断从10.0-1000.0,小数点只有一位的一个测试用例

class WeightDoubleValidator:public QDoubleValidator
{
public:
    WeightDoubleValidator(double bottom, double top, int decimals, QObject *parent = 0):QDoubleValidator(bottom,top,decimals,parent){}
    virtual QValidator::State validate(QString &input, int &pos) const
        {

            const QValidator::State origState = QDoubleValidator::validate( input, pos );
            if(input.isEmpty())
            {
                return QValidator::Intermediate;
            }
            if(input.length() > 5)
            {
                return QValidator::Invalid;
            }
            if((input.length() == 1 && input.at(0) == '.') || input.at(0) == '0')
            {
                    return QValidator::Invalid;
            }
            if(input.length() == 2 && input.at(1) == '.')
            {
                return QValidator::Invalid;
            }
            if( ( origState == QValidator::Intermediate ) && (input.toDouble() > top())  )
            {
                return QValidator::Invalid;
            }
            if(( origState == QValidator::Intermediate ) && ( input.toDouble() < bottom())  )
            {
                return QValidator::Intermediate;
            }
            else
            {
                return origState   /*QValidator::Acceptable*/;
            }
        }
};

上面针对QDoubleValidator进行了简单的重载,来实现检测输入框内的输入格式判断,当然网上也有其他人的一些见解,仁者见仁智者见智,实现功能了就好。

### QDoubleValidator 的用法 `QDoubleValidator` 是 Qt 提供的一个类,用于验证输入字符串是否为有效的浮点数。它允许设置最小值、最大值以及小数位数的范围。 以下是 `QDoubleValidator` 的基本用法: #### 设置范围和精度 可以通过构造函数或者单独的方法来设置有效数值的范围(即最小值和最大值),以及允许的小数位数。 ```cpp #include <QLineEdit> #include <QDoubleValidator> // 创建 QLineEdit 控件 QLineEdit *lineEdit = new QLineEdit(); // 构造 QDoubleValidator 对象并设置参数 QDoubleValidator *validator = new QDoubleValidator(-999.0, 999.0, 2); // 范围 [-999.0, 999.0], 小数点后最多两位 // 给 QLineEdit 设置 validator lineEdit->setValidator(validator); ``` 上述代码创建了一个只接受特定范围内双精度浮点数的编辑框[^1]。 #### 验证状态 通过调用 `validate()` 方法可以获取当前文本的状态及其位置信息。返回的结果是一个三元组 `(state, pos)`,其中 `state` 表示验证结果,可能取值如下: - `QValidator::Invalid`: 输入无效。 - `QValidator::Intermediate`: 输入部分有效(例如正在输入过程中)。 - `QValidator::Acceptable`: 完全合法的输入。 下面展示如何检测用户的输入有效性: ```cpp QString text = lineEdit->text(); int position = 0; QValidator::State state = validator->validate(text, position); if (state == QValidator::Acceptable) { qDebug() << "Input is valid."; } else if (state == QValidator::Intermediate) { qDebug() << "Input is intermediate."; } else { // Invalid case qDebug() << "Input is invalid."; } ``` 此方法可用于实时反馈用户输入的有效性。 --- ### 常见问题及解决方案 1. **无法正确显示负号** 如果发现当用户尝试键入负号时被阻止,则可能是由于未正确定义最低边界所致。确保在初始化 `QDoubleValidator` 时设置了合理的负数下限。 2. **超出设定范围仍可提交数据** 这通常是因为没有绑定信号槽机制去进一步处理非法输入的情况。建议监听 `editingFinished` 或者其他事件,在这些时刻再次确认最终内容满足条件后再继续操作。 3. **WebAssembly 支持情况** 根据已知文档说明,目前 WebAssembly 平台对于某些图形渲染技术存在限制,但这并不影响核心功能库如 `QDoubleValidator` 的正常使用[^3]。 --- ### 示例程序 这里提供一个完整的例子演示如何利用 `QDoubleValidator` 来控制用户输入行为。 ```cpp #include <QApplication> #include <QVBoxLayout> #include <QLabel> #include <QPushButton> #include <QDebug> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; QVBoxLayout layout(&window); QLabel label("Enter a double between -999 and 999:"); QLineEdit editBox; QPushButton button("Submit"); QDoubleValidator *validator = new QDoubleValidator(-999.0, 999.0, 2); editBox.setValidator(validator); QObject::connect(&button, &QPushButton::clicked, [&]() { QString valueStr = editBox.text(); bool ok; double value = valueStr.toDouble(&ok); if (!ok || !validator->validate(valueStr, 0).first != QValidator::Acceptable) { qWarning() << "Value not acceptable!"; } else { qDebug() << "Accepted:" << value; } }); layout.addWidget(&label); layout.addWidget(&editBox); layout.addWidget(&button); window.show(); return app.exec(); } ``` 该脚本构建了一款简单的 GUI 应用来测试 `QDoubleValidator` 功能。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值