3

QSpinBoxを拡張して、有効な値として「NaN」または「nan」を入力できるようにしようとしています。ドキュメントによると、これを実現するにはtextFromValue、valueFromText、validate関数を使用する必要がありますが、数値以外のテキストを入力できないため、機能させることができません。これが私の.hファイルと.cppファイルにあるものです:

CPPファイル:

#include "CustomIntSpinBox.h"

CustomIntSpinBox::CustomIntSpinBox(QWidget *parent) : QSpinBox(parent)
{
    this->setRange(-32767,32767);
}

QString CustomIntSpinBox::textFromValue(int value) const
{
    if (value == NAN_VALUE)
    {
        return QString::fromStdString("nan");
    }
    else
    {
        return QString::number(value);
    }
}

int CustomIntSpinBox::valueFromText(const QString &text) const
{
    if (text.toLower() == QString::fromStdString("nan"))
    {
        return NAN_VALUE;
    }
    else
    {
        return text.toInt();
    }
}

QValidator::State validate(QString &input, int pos)
{
    return QValidator::Acceptable;
}

Hファイル:

#ifndef CUSTOMINTSPINBOX_H
#define CUSTOMINTSPINBOX_H

#include <QSpinBox>
#include <QWidget>
#include <QtGui>
#include <iostream>

using namespace std;

#define NAN_VALUE 32767

class CustomIntSpinBox : public QSpinBox
{
    Q_OBJECT

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

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

#endif // CUSTOMINTSPINBOX_H

何か足りないものはありますか?または間違っていますか?これを行うためのより簡単な方法があれば、それも知っておくとよいでしょう...

4

3 に答える 3

4

の署名QAbstractSpinBox::validate()は次のとおりです。

QValidator::State QAbstractSpinBox::validate ( QString & input, int & pos ) const

したがって、validate()メソッドのシグネチャは2つの点で異なります。1つはそうではなくconst、もう1つは。int posの代わりにありint& posます。したがって、オーバーライドせずQAbstractSpinBox::validate、によって呼び出されることはありませんQAbstractSpinBox

于 2012-04-13T07:33:19.880 に答える
3

範囲の下限を-1だけ拡張し、通常のQSpinBoxまたはを使用して、QDoubleSpinBoxを呼び出すことができる場合は、。のときspinbox->specialValueText("nan")に文字列が表示されます。ユーザーは文字列「nan」を手動で入力することはできませんが、スピンボックスに。を実行するボタンをいつでも付けることができます。コンパイル可能な例を次に示します。nanvalue() == minimum()spinbox->setValue(spinbox->minimum())

// main.cpp
#include <QSpinBox>
#include <QDoubleSpinBox>
#include <QDialog>
#include <QApplication>
#include <QVBoxLayout>

#include <limits>

class Tester : public QDialog {
    Q_OBJECT
public:
    static const int NanValue = -32767-1;
    explicit Tester(QWidget * parent=0)
        : QDialog(parent),
          m_spinBox(new QSpinBox(this)),
          m_doubleSpinBox(new QDoubleSpinBox(this))
    {
        QVBoxLayout * vlay = new QVBoxLayout(this);
        vlay->addWidget(m_spinBox);
        vlay->addWidget(m_doubleSpinBox);

        m_spinBox->setRange(NanValue,32767);
        m_doubleSpinBox->setRange(NanValue,32767);

        m_spinBox->setValue(NanValue);
        m_doubleSpinBox->setValue(NanValue);

        updateSpecialValueText();
    }

protected:
    void changeEvent(QEvent *e) {
        QDialog::changeEvent(e);
        if (e->type() == QEvent::LocaleChange)
            updateSpecialValueText();
    }


private:
    void updateSpecialValueText() {
        static const double NaN = std::numeric_limits<double>::quiet_NaN();
        m_spinBox->setSpecialValueText(locale().toString(NaN));
        m_doubleSpinBox->setSpecialValueText(locale().toString(NaN));
    }

private:
    QSpinBox * m_spinBox;
    QDoubleSpinBox * m_doubleSpinBox;
};

int main(int argc, char * argv[]) {
    QApplication app(argc, argv);

    Tester t;
    return t.exec();
}

#include "main.moc"
于 2012-06-23T12:45:17.163 に答える
1

たぶん、QSpinBoxはQIntValidatorをQValidatorとして持つlineEditを設定します。少なくともQAbstractSpinBox::setLineEditのドキュメントは、lineEditのバリデーターがQAbstractSpinBox::validate関数よりも優先されることを示唆しています。

于 2012-04-13T00:27:04.137 に答える