0

我对 QDoubleSpinBox 进行了子类化,以制作一个允许用户输入 NaN 作为有效输入的 QDoubleSpinBox。现在,如果用户在微调框中输入“nan”,则控件会自动将文本更改为 DBL_MAX 的值,而不是保持为 nan。在我开始使用带有 nan 和 isnan 函数的 math.h 库之前,我刚刚将 NAN_VALUE 定义为 1000,范围为 -1000 到 1000。然后在我的 textFromValue 中,我检查了 value 是否等于 NAN_VALUE。同样在 valueFromText 函数中,我返回 NAN_VALUE。当我这样做时,它起作用了,但我希望能够使用 nan 和 isnan 函数。现在我添加了 nan 和 isnan 函数调用它停止工作。有谁知道这是为什么?还,我注意到当我使用 DBL_MIN 和 DBL_MAX 作为范围时,我在早期的实现中遇到了这个问题。这些数字对于控制来说是不是太大了?如果我使范围更小,例如 -1000 和 1000,它工作得很好..

这是我的实现:

CustomDoubleSpinBox.h

#ifndef CUSTOMDOUBLESPINBOX_H
#define CUSTOMDOUBLESPINBOX_H

#include <QDoubleSpinBox>
#include <QWidget>
#include <QtGui>
#include <iostream>
#include <math.h>
#include <float.h>
#include <limits>

#define NUMBER_OF_DECIMALS 2

using namespace std;

class CustomDoubleSpinBox : public QDoubleSpinBox
{
    Q_OBJECT

    public:
    CustomDoubleSpinBox(QWidget *parent = 0);
    virtual ~CustomDoubleSpinBox() throw() {}

    double valueFromText(const QString &text) const;
    QString textFromValue(double value) const;
    QValidator::State validate ( QString & input, int & pos ) const;
};

#endif // CUSTOMDOUBLESPINBOX_H

CustomDoubleSpinBox.cpp

#include "CustomDoubleSpinBox.h"

CustomDoubleSpinBox::CustomDoubleSpinBox(QWidget *parent) : QDoubleSpinBox(parent)
{
    this->setRange(DBL_MIN, DBL_MAX);
    this->setDecimals(NUMBER_OF_DECIMALS);
}

QString CustomDoubleSpinBox::textFromValue(double value) const
{
    if (isnan(value))
    {
        return QString::fromStdString("NaN");
    }
    else
    {
        QString result;
        return result.setNum(value,'f', NUMBER_OF_DECIMALS);
    }
}

double CustomDoubleSpinBox::valueFromText(const QString &text) const
{
    if (text.toLower() == QString::fromStdString("nan"))
    {
        return nan("");
    }
    else
    {
        return text.toDouble();
    }
}

QValidator::State CustomDoubleSpinBox::validate ( QString & input, int & pos ) const
{
    Q_UNUSED(input);
    Q_UNUSED(pos);

    return QValidator::Acceptable;
}
4

0 回答 0