Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Гурман от Май 20, 2015, 17:25



Название: экспоненциальный QDoubleSpinBox
Отправлено: Гурман от Май 20, 2015, 17:25
Блин... как-то не замечал, что ввод вещественных чисел в этом формате не поддерживается, даже удивился. Поиском нашёл несколько самодельных виджетов, но на qt-apps.org нет ни одного. Самому прямо сейчас делать совершенно не с руки, нужен готовый. Пусть даже не идеальный, без наворотов, пока заткнуть, потом можно будет доделать. Кто-нибудь использовал такое? Есть в природе нормальный работающий?


Название: Re: экспоненциальный QDoubleSpinBox
Отправлено: poru от Май 21, 2015, 09:30
Накидал вот такой вариант...

Код
C++ (Qt)
#include <QDoubleSpinBox>
#include <QDoubleValidator>
 
class ScientificDoubleDpinBox : public QDoubleSpinBox
{
   Q_OBJECT
 
public:
   explicit ScientificDoubleDpinBox(QWidget *parent = 0);
 
   void setMaximum(double max);
   void setMinimum(double min);
   void setDecimals(int prec);
 
   QValidator::State validate(QString &input, int &pos) const;
   double valueFromText(const QString &text) const;
   QString textFromValue(double val) const;
   void fixup(QString &str) const;
 
private:
   QDoubleValidator *m_validator;
};
 

Код
C++ (Qt)
#include <QLineEdit>
#include "scientificdoubledpinbox.h"
 
ScientificDoubleDpinBox::ScientificDoubleDpinBox(QWidget *parent) :
   QDoubleSpinBox(parent)
{
   m_validator = new QDoubleValidator(this);
   m_validator->setNotation(QDoubleValidator::ScientificNotation);
}
 
void ScientificDoubleDpinBox::setMaximum(double max)
{
   m_validator->setTop(max);
   QDoubleSpinBox::setMaximum(max);
}
 
void ScientificDoubleDpinBox::setMinimum(double min)
{
   m_validator->setBottom(min);
   QDoubleSpinBox::setMinimum(min);
}
 
void ScientificDoubleDpinBox::setDecimals(int prec)
{
   m_validator->setDecimals(prec);
   QDoubleSpinBox::setDecimals(prec);
}
 
QValidator::State ScientificDoubleDpinBox::validate(QString &input, int &pos) const
{
   return m_validator->validate(input, pos);
}
 
double ScientificDoubleDpinBox::valueFromText(const QString &text) const
{
   return text.toDouble();
}
 
QString ScientificDoubleDpinBox::textFromValue(double val) const
{
   return QString::number(val, 'e', decimals());
}
 
void ScientificDoubleDpinBox::fixup(QString &str) const
{
   return m_validator->fixup(str);
}
 

Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   ScientificDoubleDpinBox *sciDoubleSpinBox = new ScientificDoubleDpinBox(this);
   sciDoubleSpinBox->setMaximum(999999999.999999999);
   sciDoubleSpinBox->setMinimum(0.0);
   sciDoubleSpinBox->setDecimals(2);
 
   ui->verticalLayout->addWidget(sciDoubleSpinBox);
}
 

Dpin  :D


Название: Re: экспоненциальный QDoubleSpinBox
Отправлено: poru от Май 21, 2015, 11:52
Обнаружил БАГ для очень больших или очень маленьких значений из-за функции округления:

Код
C++ (Qt)
double QDoubleSpinBoxPrivate::round(double value) const
{
   return QString::number(value, 'f', decimals).toDouble();
}
 


Название: Re: экспоненциальный QDoubleSpinBox
Отправлено: Гурман от Май 21, 2015, 20:22
"Накидать" я и сам могу, и даже наверно получше. Речь не об этом. Вопрос был именно о тех, которые лежат в Сети, например QScienceSpinBox. Явно существуют давно, и по идее, должны иметь минимум дырок. Но насколько они, что называется, консистентны?


Название: Re: экспоненциальный QDoubleSpinBox
Отправлено: Igors от Май 22, 2015, 07:32
"Накидать" я и сам могу, и даже наверно получше.
Да что-то не очень верится если такая мелочь для Вас проблема.

Вопрос был именно о тех, которые лежат в Сети, например QScienceSpinBox. Явно существуют давно, и по идее, должны иметь минимум дырок. Но насколько они, что называется, консистентны?
Так откройте исходники того же QScienceSpinBox и пролистайте - или что, уже "сам не могу"  :)

Мне лично QScienceSpinBox доверия не внушает, слишком много возни с ручным разбором текста. И не видно важной вещи - адаптивный шаг (для больших значений и прирост должен быть больше, и наоборот). У меня была аналогичная проблема, повозюкался QDoubleSpinBox - не оправдывает себя, слишком много надо затыкать/перекрывать. Сделал свой виджет (QLineEdit + spinner) 


Название: Re: экспоненциальный QDoubleSpinBox
Отправлено: Гурман от Май 22, 2015, 14:18
Да что-то не очень верится если такая мелочь для Вас проблема.

Я уже говорил, что с вопросами веры, это не ко мне, это в церковь. У меня проблем "накидать" нет, есть проблемы со временем для таких незапланированных мелочей - оно нужно для более сложных и объемных задач, которые стоят в очереди.[/sub][/color]

Мне лично QScienceSpinBox доверия не внушает, слишком много возни с ручным разбором текста. И не видно важной вещи - адаптивный шаг (для больших значений и прирост должен быть больше, и наоборот).

А какая возня с ручным разбором? Я так понимаю разбор должен быть в этом классе уже реализован - или это не так? В чем тогда смысл этого класса, если нет разбора?

У меня есть свои функции преобразования из экспоненциального вида (на самом деле, работают для любого) char* во float/double и наоборот, с проверкой формата строки, хорошо отлаженные, многократно проверенные, работают уже лет 20. При условии их наличия, чего еще не хватает QScienceSpinBox?

Хотя я, конечно понимаю, что придётся всё-таки делать свою функцию, хотя бы для того, чтобы спинов было 2, один для мантиссы и другой для порядка. Но сейчас надо на время заткнуть эту дырку.

Адаптивный шаг как раз легко прикрутить, если есть исходник.


Название: Re: экспоненциальный QDoubleSpinBox
Отправлено: Igors от Май 22, 2015, 15:31
Я уже говорил, что с вопросами веры, это не ко мне, это в церковь.
Что "ко мне"?  Я у Вас ничего не просил.

У меня есть свои функции преобразования из экспоненциального вида (на самом деле, работают для любого) char* во float/double и наоборот, с проверкой формата строки, хорошо отлаженные, многократно проверенные, работают уже лет 20. При условии их наличия, чего еще не хватает QScienceSpinBox?
Тогда вообще не видно зачем привлекать QScienceSpinBox, который как раз мусолит входной формат (возможно повторяя Ваши ф-ции), Делайте по образцу того что предложил poru вставляя проверенное

Адаптивный шаг как раз легко прикрутить, если есть исходник.
Жизнь покажет


Название: Re: экспоненциальный QDoubleSpinBox
Отправлено: poru от Май 26, 2015, 12:18
Цитировать
У меня проблем "накидать" нет, есть проблемы со временем для таких незапланированных мелочей
Это ни хрена не мелочь для весьма востребованной компоненты. Я поговорил с нашими инженерами на работе и они то же хотели бы использовать такую возможность для ряда случаев.

Цитировать
Мне лично QScienceSpinBox доверия не внушает, слишком много возни с ручным разбором текста.
Надо отметить, что разбор текста и добрая половина QScienceSpinBox скопирована из исходников Qt4.2

Цитировать
Делайте по образцу того что предложил poru вставляя проверенное
Не советую. В предложенном мною варианте, накиданном на скорую руку, не работает валидатор и есть ошибка округления.  Но для...
Цитировать
Пусть даже не идеальный, без наворотов, пока заткнуть, потом можно будет доделать
вполне сойдет.

Ошибку округления я уже знаю как исправить, но заставить работать валидатор так и не получилось.
Есть мнение, что для реализации новых возможностей лучше всего написать по новой DoubleSpinBox наследуясь от QAbstractSpinBox.


Название: Re: экспоненциальный QDoubleSpinBox
Отправлено: Гурман от Май 27, 2015, 00:13
Вообще у Троллей что-то странное с этим вопросом. Один из первых виджетов (когда-то вроде даже читал, что Qt с него начинался) - QLCDNumber - и показывает превосходно вещественные в экспоненциальной форме, и что особенно смешно, умеет принимать QString. Правда, я не пробовал ему в этой строке экспоненциальное представление скормить (завтра можно попробовать...). Но в строчном редакторе почему-то до сих пор обломс, хотя продукту уже более 20 лет.


Название: Re: экспоненциальный QDoubleSpinBox
Отправлено: poru от Июнь 16, 2015, 12:25
Вот новый вариант - https://sourceforge.net/projects/qscidoublespinbox/ (https://sourceforge.net/projects/qscidoublespinbox/)
Работает валидатор ввода.
Нижний/верхний регистр.
Отдельная регулировка мантиссы и порядка по принципу QDateTimeEdit.


Название: Re: экспоненциальный QDoubleSpinBox
Отправлено: Гурман от Июнь 16, 2015, 12:37
Вот новый вариант - https://sourceforge.net/projects/qscidoublespinbox/ (https://sourceforge.net/projects/qscidoublespinbox/)
Работает валидатор ввода.
Нижний/верхний регистр.
Отдельная регулировка мантиссы и порядка по принципу QDateTimeEdit.

Пару картинок там разместите вменяемых, с цифрами, вырезки из скриншотов.