0

ユーザーが有効な入力として NaN を入力できるようにする QDoubleSpinBox を作成するために、QDoubleSpinBox をサブクラス化しました。現在、ユーザーがスピンボックスに「nan」と入力すると、コントロールは自動的にテキストを nan のままではなく、DBL_MAX の値に変更します。nan 関数と isnan 関数で math.h ライブラリを使い始める前に、NAN_VALUE を 1000 に、範囲を -1000 から 1000 に定義しました。同様に、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