考虑这个问题。
我的工具中有一个QLineEdit,我应该按如下方式组织支持。 LineEdit的文本必须只包含双精度值,将我的逗号分开。 F.E. 6.2,8,9.0,55 我还必须验证,用户不能输入任何其他字符,但数字和昏迷。另外我应该编写一个将此文本转换为向量的方法。 最初我想到了QRegExp和boost :: spirit。但使用这些技术可能很难。
有什么想法吗?
答案 0 :(得分: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;
}