首页 文章

强制QLineEdit是double值的集合

提问于
浏览
0

考虑这个问题 .

我的工具中有一个QLineEdit,我应该按如下方式组织支持 . LineEdit的文本必须只包含双值,将我的逗号分开 . F.E. 6.2,8,9.0,55我也必须验证,用户不能输入任何其他字符而是数字和昏迷 . 另外我应该编写一个将此文本转换为向量的方法 . 最初我想到了QRegExp和boost :: spirit . 但使用这些技术可能很难 .

有任何想法吗?

1 回答

  • 1

    使用下一个自定义验证器 .

    Headers :

    #ifndef VALIDATOR_H
    #define VALIDATOR_H
    
    #include <QValidator>
    
    class Validator : public QValidator
    {
        Q_OBJECT
    public:
        explicit Validator(QObject *parent = 0);
    
    signals:
    
    public slots:
    public:
        QValidator::State validate(QString & input, int & pos) const;
    
    };
    
    #endif // VALIDATOR_H
    

    CPP:

    #include "validator.h"
    #include <QDoubleValidator>
    #include <QDebug>
    Validator::Validator(QObject *parent) :
        QValidator(parent)
    {
    }
    
    QValidator::State Validator::validate(QString &input, int &pos) const
    {
        qDebug() << input<< pos;
        QDoubleValidator val;
        val.setLocale(QLocale(QLocale::German,QLocale::Germany));
        input.remove(" ");
        QStringList list = input.split(",");
        foreach ( QString var, list) {
            int i = 0;
            if(val.validate(var,i) == QValidator::Invalid)
                return QValidator::Invalid;
        }
        return QValidator::Acceptable;
    
    }
    

    用法:

    ui->lineEdit->setValidator(new Validator);
    

    关于: val.setLocale(QLocale(QLocale::German,QLocale::Germany)); 的说明

    你说你想要使用 6.2,... 但是 ., 在不同的国家是不同的小数点 . 所以我根据你的问题写了相应的例子 . 德国语言环境总是认为 . 是正确的观点 .

    但我建议你使用特定于语言环境的小数点并用于此目的;作为分隔符而不是昏迷 .

    有错误,所以试试这个 . 编辑(改善):

    QValidator::State Validator::validate(QString &input, int &pos) const
    {
        qDebug() << input<< pos;
        QRegExpValidator reg(QRegExp("[0-9]+(\\.[0-9]+)?$"));
        input.remove(" ");
        if(input.contains(",,") || input.startsWith(","))
            return QValidator::Invalid;
        QStringList list = input.split(",");
        qDebug()<< list;
        bool isOk = true;
        foreach ( QString var, list) {
            int i = 0;
            if(reg.validate(var,i) == QValidator::Invalid)
                return QValidator::Invalid;
            if(reg.validate(var,i) == QValidator::Intermediate)
                isOk = false;
        }
        if(isOk)
            return QValidator::Acceptable;
        else
            return QValidator::Intermediate;
    }
    

相关问题