0

考虑这个问题。

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

有任何想法吗?

4

1 回答 1

1

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

标题:

#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

价格:

#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,...but . and,是不同国家的不同小数点。所以我根据你的问题写了例子。German Locale 始终认为这.是一个正确的观点。

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

有错误,所以试试这个。编辑(改进):

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;
}
于 2014-11-27T11:32:31.047 回答