2014-11-27 6 views
0

Рассмотрите эту проблему.Force QLineEdit представляет собой набор двойных значений

У меня есть QLineEdit в моем инструменте, и я должен организовать поддержку следующим образом. Текст LineEdit должен содержать только двойные значения, разделенные моими комами. F.e. 6.2, 8, 9.0, 55 Я также должен подтвердить, что пользователь не может вводить какой-либо другой символ, кроме цифр и комов. Также я должен написать метод, который преобразует этот текст в вектор. Первоначально я думал об QRegExp и boost :: spirit. Но это может быть трудно использовать эту технику.

Любые идеи?

+0

На этом сайте есть несколько вопросов относительно 'QValidators' и' QRegExp'. [Например, это] (http://stackoverflow.com/questions/26777795/how-to-use-qlineedit-to-enter-integer-values/26778010#26778010). Пожалуйста, найдите, прочитайте, попробуйте и вернитесь, если у вас возникнут какие-либо конкретные проблемы. – Bowdzone

ответ

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,..., но . и , отличается от десятичной точки в разных странах. Поэтому я написал пример в соответствии с вашим вопросом. Немецкий язык всегда считает, что . - правильная точка.

Но я рекомендую вам использовать десятичную точку, специфичную для локали, и использовать ее для этого Назначения; как разделитель вместо комы.

Ошибки, поэтому попробуйте это. Редактировать (улучшить):

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; 
} 
+0

Собственно, в этом случае вы допускаете такие вещи. 2.2.2.2.2, и, кроме того, я могу найти рабочий стол, чтобы создать это, 5,, 5. Это неверно. –

+0

@EduardRostomyan Я думаю, что я исправил эти ошибки, проверьте мое редактирование, пожалуйста, я переписал целую проверку() – Chernobyl

 Смежные вопросы

  • Нет связанных вопросов^_^