396 lines
11 KiB
C
396 lines
11 KiB
C
|
|
/**
|
|||
|
|
* @file PaiValidator.h
|
|||
|
|
* @brief 定义常用的字符串限定正则表达式。如命名,ID,Email,电话号码等。
|
|||
|
|
* @date 2014-12-05
|
|||
|
|
*/
|
|||
|
|
#ifndef PAI_FRAME_CRYSTAL_PAIVALIDATOR_H
|
|||
|
|
#define PAI_FRAME_CRYSTAL_PAIVALIDATOR_H
|
|||
|
|
|
|||
|
|
#include <limits>
|
|||
|
|
#include <QRegExpValidator>
|
|||
|
|
#include <QToolTip>
|
|||
|
|
|
|||
|
|
namespace pai
|
|||
|
|
{
|
|||
|
|
namespace gui
|
|||
|
|
{
|
|||
|
|
/**
|
|||
|
|
* @class PaiNameValidator
|
|||
|
|
* @brief 要求输入文件名时使用该 Validator
|
|||
|
|
*/
|
|||
|
|
class PaiNameValidator : public QRegExpValidator
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
/**
|
|||
|
|
* @brief 输入文件名字的要求,应与提示信息FailureMessage一致,允许输入小数点并以小数点开头(15930)(28931)(31250)(32741)
|
|||
|
|
* @param[in] pParent 父对象
|
|||
|
|
*/
|
|||
|
|
PaiNameValidator(QObject *pParent) :
|
|||
|
|
QRegExpValidator(QRegExp("[\u4e00-\u9fa50-9a-zA-Z_\\-\\.]+$"), pParent)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获得Validator失败后要提示的信息
|
|||
|
|
* @return 提示信息
|
|||
|
|
*/
|
|||
|
|
QString GetFailureMessage()
|
|||
|
|
{
|
|||
|
|
return QObject::tr("Please Use a-z, A-Z, 0-9,_,.,- and Chinese only!");
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @class PaiIntValidator
|
|||
|
|
* @brief 输入整数的 Validator
|
|||
|
|
*/
|
|||
|
|
class PaiIntValidator : public QIntValidator
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
/**
|
|||
|
|
* @brief 构造函数
|
|||
|
|
* @param[in] pParent 父对象
|
|||
|
|
*/
|
|||
|
|
PaiIntValidator(QObject *pParent) :
|
|||
|
|
QIntValidator(pParent)
|
|||
|
|
{
|
|||
|
|
m_bSupportNullString = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 构造函数
|
|||
|
|
* @param[in] min 下限
|
|||
|
|
* @param[in] max 上限
|
|||
|
|
* @param[in] pParent 父对象
|
|||
|
|
*/
|
|||
|
|
PaiIntValidator(int min, int max, QObject *pParent) :
|
|||
|
|
QIntValidator(min, max, pParent)
|
|||
|
|
{
|
|||
|
|
m_bSupportNullString = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 设置Validator是否支持空字符,空字符是否能通过验证
|
|||
|
|
* @param[in] support 为true支持,为false不支持
|
|||
|
|
*/
|
|||
|
|
void SetSupportNullString(bool support)
|
|||
|
|
{
|
|||
|
|
m_bSupportNullString = support;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 当前操作是否合法
|
|||
|
|
* @param[in] input 输入字符串
|
|||
|
|
* @param[in] pos 输入位置
|
|||
|
|
*/
|
|||
|
|
virtual QValidator::State validate(QString & input, int & pos) const
|
|||
|
|
{
|
|||
|
|
// 多位数字,首位不能为0
|
|||
|
|
if((pos == 2) && (input.count() > 1) && (input.left(1) == "0"))
|
|||
|
|
{
|
|||
|
|
return QValidator::Invalid;
|
|||
|
|
}
|
|||
|
|
// 不能出现逗号
|
|||
|
|
if(input.contains(","))
|
|||
|
|
{
|
|||
|
|
return QValidator::Invalid;
|
|||
|
|
}
|
|||
|
|
if(m_bSupportNullString == true && input.isEmpty())
|
|||
|
|
{
|
|||
|
|
return QValidator::Acceptable;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return QIntValidator::validate(input, pos);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
bool m_bSupportNullString; ///< 该变量表示是否支持空字符,默认不支持
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @class PaiIdValidator
|
|||
|
|
* @brief 输入 id 的限制
|
|||
|
|
*/
|
|||
|
|
class PaiIdValidator : public QRegExpValidator
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
/**
|
|||
|
|
* @brief 限定用户ID只能输入a-z A-Z 1-19个
|
|||
|
|
* @param[in] pParent 父对象
|
|||
|
|
*/
|
|||
|
|
PaiIdValidator(QObject *pParent) :
|
|||
|
|
QRegExpValidator(QRegExp("[a-zA-Z0-9]{1,19}"), pParent)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @class PaiEmailValidator
|
|||
|
|
* @brief 输入email的时候对一些字符的限定
|
|||
|
|
*/
|
|||
|
|
class PaiEmailValidator : public QRegExpValidator
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
/**
|
|||
|
|
* @brief 限定用户只能输入数字 字母 "@" "."
|
|||
|
|
* @param[in] pParent 父对象
|
|||
|
|
*/
|
|||
|
|
PaiEmailValidator(QObject *pParent) :
|
|||
|
|
QRegExpValidator(QRegExp("^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"), pParent)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @class PaiTimeValidator
|
|||
|
|
* @brief 输入TIME的 Validator
|
|||
|
|
*/
|
|||
|
|
class PaiTimeValidator : public QValidator
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
/**
|
|||
|
|
* @brief 父对象
|
|||
|
|
* @param[in] pParent 父对象
|
|||
|
|
*/
|
|||
|
|
PaiTimeValidator(QObject *pParent = NULL) :
|
|||
|
|
QValidator(pParent)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 当前操作是否合法
|
|||
|
|
* @param[in] input 输入字符串
|
|||
|
|
*/
|
|||
|
|
virtual QValidator::State validate(QString & input, int & /*pos*/) const
|
|||
|
|
{
|
|||
|
|
QRegExp regx = QRegExp("[0-9.dhms ]+$");
|
|||
|
|
QString copyText = input;
|
|||
|
|
QWidget *pWidget = qobject_cast< QWidget * > (parent());
|
|||
|
|
QWidget *pParentWidget = NULL;
|
|||
|
|
if(pWidget)
|
|||
|
|
{
|
|||
|
|
pParentWidget = pWidget->parentWidget();
|
|||
|
|
}
|
|||
|
|
//输入为空给出输入提示
|
|||
|
|
if(copyText == "")
|
|||
|
|
{
|
|||
|
|
if(pParentWidget)
|
|||
|
|
{
|
|||
|
|
QToolTip::showText(pParentWidget->mapToGlobal(pWidget->pos()) + QPoint(pWidget->width() / 3,
|
|||
|
|
pWidget->height() / 2),
|
|||
|
|
"valid format:00d 00h 00m 00s ",
|
|||
|
|
pWidget);
|
|||
|
|
}
|
|||
|
|
return QValidator::Acceptable;
|
|||
|
|
}
|
|||
|
|
//输入非法字符
|
|||
|
|
else if(!regx.exactMatch(copyText))
|
|||
|
|
{
|
|||
|
|
if(pParentWidget)
|
|||
|
|
{
|
|||
|
|
QToolTip::showText(pParentWidget->mapToGlobal(pWidget->pos()) + QPoint(pWidget->width() / 3,
|
|||
|
|
pWidget->height() / 2),
|
|||
|
|
"valid format:00d 00h 00m 00s ",
|
|||
|
|
pWidget);
|
|||
|
|
}
|
|||
|
|
return QValidator::Invalid;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//d,h,m,s,顺序正确
|
|||
|
|
int d = copyText.indexOf('d');
|
|||
|
|
int h = copyText.indexOf('h');
|
|||
|
|
int m = copyText.indexOf('m');
|
|||
|
|
int s = copyText.indexOf('s');
|
|||
|
|
if(!((d <= h || m == -1) && (h <= m || m == -1) && (m <= s || s == -1)))
|
|||
|
|
{
|
|||
|
|
if(pParentWidget)
|
|||
|
|
{
|
|||
|
|
QToolTip::showText(pParentWidget->mapToGlobal(pWidget->pos()) + QPoint(pWidget->width() / 3,
|
|||
|
|
pWidget->height() / 2),
|
|||
|
|
"valid format:00d 00h 00m 00s ",
|
|||
|
|
pWidget);
|
|||
|
|
}
|
|||
|
|
return QValidator::Invalid;
|
|||
|
|
}
|
|||
|
|
//d,h,m,s,不允许重复
|
|||
|
|
d = copyText.count('d');
|
|||
|
|
h = copyText.count('h');
|
|||
|
|
m = copyText.count('m');
|
|||
|
|
s = copyText.count('s');
|
|||
|
|
if(!(d <= 1 && h <= 1 && m <= 1 && s <= 1))
|
|||
|
|
{
|
|||
|
|
if(pParentWidget)
|
|||
|
|
{
|
|||
|
|
QToolTip::showText(pParentWidget->mapToGlobal(pWidget->pos()) + QPoint(pWidget->width() / 3,
|
|||
|
|
pWidget->height() / 2),
|
|||
|
|
"valid format:00d 00h 00m 00s ",
|
|||
|
|
pWidget);
|
|||
|
|
}
|
|||
|
|
return QValidator::Invalid;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 输入s后不允许在输入
|
|||
|
|
copyText.remove(" ");
|
|||
|
|
int size = copyText.size();
|
|||
|
|
if(size - 2 >= 0)
|
|||
|
|
{
|
|||
|
|
if(copyText.at(size - 2) == 's')
|
|||
|
|
{
|
|||
|
|
if(pParentWidget)
|
|||
|
|
{
|
|||
|
|
QToolTip::showText(pParentWidget->mapToGlobal(pWidget->pos()) + QPoint(pWidget->width() / 3,
|
|||
|
|
pWidget->height() / 2),
|
|||
|
|
"valid format:00d 00h 00m 00s ",
|
|||
|
|
pWidget);
|
|||
|
|
}
|
|||
|
|
return QValidator::Invalid;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return QValidator::Acceptable;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @class PaiPasswordValidator
|
|||
|
|
* @brief 对输入密码进行限制
|
|||
|
|
*/
|
|||
|
|
class PaiPasswordValidator : public QRegExpValidator
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
/**
|
|||
|
|
* @brief 限定用户ID只能输入a-z A-Z 合规定的特殊字符
|
|||
|
|
* @param[in] pParent 父对象
|
|||
|
|
*/
|
|||
|
|
PaiPasswordValidator(QObject *pParent) :
|
|||
|
|
QRegExpValidator(QRegExp(
|
|||
|
|
"[a-zA-Z0-9\
|
|||
|
|
\\`\\!\\@\\#\\$\\%\\^\\&\
|
|||
|
|
\\*\\(\\)\\_\\+\\-\\=\\{\
|
|||
|
|
\\}\\|\\[\\]\\\\\\:\"\\;\\'\
|
|||
|
|
\\<\\>\\?\\,\\.\\/]{0,}"),
|
|||
|
|
pParent)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @class PaiPhoneNumberValidator
|
|||
|
|
* @brief 对电话号码的填写进行限定,标准的国际号码应该为:
|
|||
|
|
* 【“+” + “国家代码” + “地区代码” + “电话号码”-"分机号码"】
|
|||
|
|
*/
|
|||
|
|
class PaiPhoneNumberValidator : public QRegExpValidator
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
/**
|
|||
|
|
* @brief 限定的名称【“+”】+【1~6位国家代码】+【“(”1~3位地区代码前缀“)”1~6位地区代码】+ 【电话号码】 + 【分机号码】
|
|||
|
|
* @param[in] pParent 父对象
|
|||
|
|
*/
|
|||
|
|
PaiPhoneNumberValidator(QObject *pParent) :
|
|||
|
|
QRegExpValidator(QRegExp("^(\\+\\d{1,6}-)?((\\(\\d{1,3}\\))?(\\d{1,6}-))?(\\d{1,15})(-\\d{1,5})?$"),
|
|||
|
|
pParent)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 当前操作是否合法
|
|||
|
|
* @param[in] input 输入字符串
|
|||
|
|
* @param[in] pos 输入位置
|
|||
|
|
*/
|
|||
|
|
virtual QRegExpValidator::State validate(QString & input, int & pos) const
|
|||
|
|
{
|
|||
|
|
if(QRegExpValidator::validate(input, pos) == QRegExpValidator::Invalid)
|
|||
|
|
{
|
|||
|
|
return QRegExpValidator::Invalid;
|
|||
|
|
}
|
|||
|
|
else // 在合法的基础上判断是否为全'0'与'-'的情况
|
|||
|
|
{
|
|||
|
|
QString strInput = input;
|
|||
|
|
if(strInput.remove('0').remove('-').isEmpty())
|
|||
|
|
{
|
|||
|
|
return QRegExpValidator::Intermediate;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return QRegExpValidator::validate(input, pos);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @class PaiFloatValidator
|
|||
|
|
* @brief 对输入float类型数据填写进行限定
|
|||
|
|
*/
|
|||
|
|
class PaiFloatValidator : public QDoubleValidator
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
/**
|
|||
|
|
* @brief 构造函数
|
|||
|
|
* @param[in] pParent 父对象
|
|||
|
|
* @param[in] decimal 小数位数
|
|||
|
|
*/
|
|||
|
|
PaiFloatValidator(QObject *pParent, int decimal = 2) :
|
|||
|
|
QDoubleValidator(pParent)
|
|||
|
|
{
|
|||
|
|
this->setNotation(QDoubleValidator::StandardNotation); // 设置不接受科学计数法输入
|
|||
|
|
this->setTop(std::numeric_limits< float >::max()); // 防止输入数字值越界
|
|||
|
|
this->setDecimals(decimal); // 设置小数点后位数
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 构造函数
|
|||
|
|
* @param[in] top 上限值
|
|||
|
|
* @param[in] bottom 下限值
|
|||
|
|
* @param[in] pParent 父对象
|
|||
|
|
* @param[in] decimal 小数位数
|
|||
|
|
*/
|
|||
|
|
PaiFloatValidator(double top, double bottom, QObject *pParent, int decimal = 2) :
|
|||
|
|
QDoubleValidator(top, bottom, decimal, pParent)
|
|||
|
|
{
|
|||
|
|
this->setNotation(QDoubleValidator::StandardNotation); // 设置不接受科学计数法输入
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 当前操作是否合法
|
|||
|
|
* @param[in] input 输入字符串
|
|||
|
|
* @param[in] pos 输入位置
|
|||
|
|
*/
|
|||
|
|
virtual QDoubleValidator::State validate(QString & input, int & pos) const
|
|||
|
|
{
|
|||
|
|
// 正数,不能连续输入0
|
|||
|
|
if((pos == 2) && (input.count() >= 2) && (input.left(2) == "00"))
|
|||
|
|
{
|
|||
|
|
return QDoubleValidator::Invalid;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 负数,不能连续输入0
|
|||
|
|
if((pos == 3) && (input.count() >= 3) && (input.left(3) == "-00"))
|
|||
|
|
{
|
|||
|
|
return QDoubleValidator::Invalid;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(input.isEmpty() || (input == "-"))//允许全选删除以及输入小数点“0.” “-0.”
|
|||
|
|
{
|
|||
|
|
return QDoubleValidator::validate(input, pos);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool ok = false;
|
|||
|
|
input.toFloat(&ok);
|
|||
|
|
if(ok)
|
|||
|
|
{
|
|||
|
|
return QDoubleValidator::validate(input, pos);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return QDoubleValidator::Invalid;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endif ///< PAI_FRAME_CRYSTAL_PAIVALIDATOR_H
|