【问题标题】:Force QLineEdit to be a collection of double values强制 QLineEdit 成为双精度值的集合
【发布时间】:2014-11-27 10:49:12
【问题描述】:

考虑这个问题。

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

有什么想法吗?

【问题讨论】:

  • 本网站上有一些关于QValidatorsQRegExp 的问题。 For instance this。如果您遇到任何具体问题,请搜索、阅读、试用并返回

标签: c++ regex qt boost-spirit qregexp


【解决方案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

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,...,但., 在不同国家/地区的小数点不同。所以我根据你的问题写了例子。 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;
}

【讨论】:

  • 实际上,在这种情况下,您允许这样的事情。 2.2.2.2.2,此外,我可以找到一个工作区来创建这个 ,5,,5。这是不正确的。
  • @EduardRostomyan 我认为我修复了这个错误,请检查我的编辑,我重写了整个 validate()
猜你喜欢
  • 2023-03-03
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多