nic*_*ole 6 c++ validation qt qlineedit
我有一组QLineEdits应该接受一定范围内的双重值(例如,-15到15).
在设置每个时,我有以下几点:
lineEdit->setValidator(new QDoubleValidator(minVal, maxVal, 5, lineEdit));
Run Code Online (Sandbox Code Playgroud)
理想情况下,行编辑可以使用,只能输入范围内的值.当我尝试这个时,我注意到只有数字可以根据需要输入,但它们仍然可以超出范围.
如何动态强制输入以适应范围(例如,如果范围是-15到15并且用户键入1,则尝试键入9,它不起作用/显示9 ...但键入1然后2确实工作/显示2.)?
我是否需要在validate()某处连接并调用该功能?
VVV*_*VVV 10
这是因为QDoubleValidator返回QValidator::Intermediate值是否超出界限的和QLineEdit接受QValidator::Intermediate的值.
要实现您想要的行为,您可以QDoubleValidator像这样创建自己的子类:
class MyValidator : public QDoubleValidator
{
public:
MyValidator(double bottom, double top, int decimals, QObject * parent) :
QDoubleValidator(bottom, top, decimals, parent)
{
}
QValidator::State validate(QString &s, int &i) const
{
if (s.isEmpty()) {
return QValidator::Intermediate;
}
bool ok;
double d = s.toDouble(&ok);
if (ok && d > 0 && d < 15) {
return QValidator::Acceptable;
} else {
return QValidator::Invalid;
}
}
};
Run Code Online (Sandbox Code Playgroud)
更新:这将解决负号问题,也将接受语言环境双重格式:
class MyValidator : public QDoubleValidator
{
public:
MyValidator(double bottom, double top, int decimals, QObject * parent) :
QDoubleValidator(bottom, top, decimals, parent)
{
}
QValidator::State validate(QString &s, int &i) const
{
if (s.isEmpty() || s == "-") {
return QValidator::Intermediate;
}
QChar decimalPoint = locale().decimalPoint();
if(s.indexOf(decimalPoint) != -1) {
int charsAfterPoint = s.length() - s.indexOf(decimalPoint) - 1;
if (charsAfterPoint > decimals()) {
return QValidator::Invalid;
}
}
bool ok;
double d = locale().toDouble(s, &ok);
if (ok && d >= bottom() && d <= top()) {
return QValidator::Acceptable;
} else {
return QValidator::Invalid;
}
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10571 次 |
| 最近记录: |