Я пытаюсь расширить QSpinBox, чтобы иметь возможность вводить «NaN» или «nan» в качестве допустимого значения. Согласно документации, я должен использовать textFromValue, valueFromText и проверять функции, чтобы выполнить это, но я не могу заставить его работать, поскольку он все еще не позволяет мне вводить текст, кроме цифр. Вот что я имею в моих .h и .cpp файлов:QSpinBox вводит NaN в качестве действительного значения
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
Есть ли что-то им не хватает? или делать не так? Если theres и более простой способ сделать это, также было бы здорово знать ...
Некоторые предложения относительно вашего кода, независимо от вопроса: (1) Не используйте спецификацию броска, если вы должны, так как базовый класс делает ([Sutter/Alexandrescu] (Http: // www.amazon.com/Coding-Standards-Rules-Guidelines-Practices/dp/0321113586), пункт 75). (2) Сделайте ваш ctor 'явным' (ibid, пункт 40). (3) Не пишите 'using namespace' в заголовке (там же, пункт 59). (4) Используйте 'static const int NAN_VALUE = 32767;' вместо '# define' (там же, пункт 16). (5) Не '#include' (замедляет компиляцию). (6) Используйте 'QLatin1String (« nan »)' вместо 'QString :: fromStdString (« nan »)' (быстрее). –