QValidator in Qt?

3

我正在验证我的文本框,使其只接受1-75之间的数字。 通过使用以下代码,我能够实现这一点:

QValidator *validator = new QIntValidator(1, 75, this);
QLineEdit *edit = new QLineEdit(this);
edit->setValidator(validator);

但现在的问题是它也接受零。我想避免零。任何帮助都将不胜感激。
3个回答

12

当前您并未进行验证:当您设置一个QValidator时,只是对可以组成有效输入的字符进行过滤。

为了进行实际的验证,您需要检查QLineEdit::hasAcceptableInput()返回的值是否为true

例如,在连接到textChanged()信号的槽中,您可以根据acceptableInput属性的值启用/禁用提交数据的按钮,防止用户使用无效值继续进行,并/或更改文本颜色(无效值为红色)。

对于数值,您还可以使用QSpinBox而不是QLineEdit。您可以定义其范围(最小/最大值),以及在编辑完成时值无效时的行为(使用QSpinBox::setCorrectionMode)。


3

您可以这样编写自己的验证器:

 class lvalidator : public QValidator
    {
        Q_OBJECT
    public:
        explicit lvalidator(QObject *parent = 0);
        virtual State validate ( QString & input, int & pos ) const
        {
            if (input.isEmpty())
                return Acceptable;

            bool b;
            int val = input.toInt(&b);

            if ((b == true) && (val > 0) && (val < 76))
            {
                return Acceptable;
            }
            return Invalid;
        }
    };

5
为什么你要为布尔值分配堆内存而不是使用栈并取其地址?这样不会导致内存泄漏吗? - Carrotman42
不要忘记定义构造函数 :) - Dumbo

2

当你输入'0'时,Qt会将其解释为可编辑的合理中间值。如果你不喜欢这种行为,你需要创建一个继承自QIntValidator的类,并重新实现以下函数:

virtual QValidator::State validate ( QString & input, int & pos ) const

致敬。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接