Russian Qt Forum
Апрель 25, 2024, 19:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: экспоненциальный QDoubleSpinBox  (Прочитано 8293 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Май 20, 2015, 17:25 »

Блин... как-то не замечал, что ввод вещественных чисел в этом формате не поддерживается, даже удивился. Поиском нашёл несколько самодельных виджетов, но на qt-apps.org нет ни одного. Самому прямо сейчас делать совершенно не с руки, нужен готовый. Пусть даже не идеальный, без наворотов, пока заткнуть, потом можно будет доделать. Кто-нибудь использовал такое? Есть в природе нормальный работающий?
Записан

2^7-1 == 127, задумайтесь...
poru
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #1 : Май 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  Веселый
« Последнее редактирование: Май 21, 2015, 09:36 от poru » Записан
poru
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #2 : Май 21, 2015, 11:52 »

Обнаружил БАГ для очень больших или очень маленьких значений из-за функции округления:

Код
C++ (Qt)
double QDoubleSpinBoxPrivate::round(double value) const
{
   return QString::number(value, 'f', decimals).toDouble();
}
 
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #3 : Май 21, 2015, 20:22 »

"Накидать" я и сам могу, и даже наверно получше. Речь не об этом. Вопрос был именно о тех, которые лежат в Сети, например QScienceSpinBox. Явно существуют давно, и по идее, должны иметь минимум дырок. Но насколько они, что называется, консистентны?
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Май 22, 2015, 07:32 »

"Накидать" я и сам могу, и даже наверно получше.
Да что-то не очень верится если такая мелочь для Вас проблема.

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

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

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Май 22, 2015, 14:18 »

Да что-то не очень верится если такая мелочь для Вас проблема.

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

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

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

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

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

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

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Май 22, 2015, 15:31 »

Я уже говорил, что с вопросами веры, это не ко мне, это в церковь.
Что "ко мне"?  Я у Вас ничего не просил.

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

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

Сообщений: 103


Просмотр профиля
« Ответ #7 : Май 26, 2015, 12:18 »

Цитировать
У меня проблем "накидать" нет, есть проблемы со временем для таких незапланированных мелочей
Это ни хрена не мелочь для весьма востребованной компоненты. Я поговорил с нашими инженерами на работе и они то же хотели бы использовать такую возможность для ряда случаев.

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

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

Ошибку округления я уже знаю как исправить, но заставить работать валидатор так и не получилось.
Есть мнение, что для реализации новых возможностей лучше всего написать по новой DoubleSpinBox наследуясь от QAbstractSpinBox.
« Последнее редактирование: Май 26, 2015, 12:21 от poru » Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #8 : Май 27, 2015, 00:13 »

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

2^7-1 == 127, задумайтесь...
poru
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #9 : Июнь 16, 2015, 12:25 »

Вот новый вариант - https://sourceforge.net/projects/qscidoublespinbox/
Работает валидатор ввода.
Нижний/верхний регистр.
Отдельная регулировка мантиссы и порядка по принципу QDateTimeEdit.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #10 : Июнь 16, 2015, 12:37 »

Вот новый вариант - https://sourceforge.net/projects/qscidoublespinbox/
Работает валидатор ввода.
Нижний/верхний регистр.
Отдельная регулировка мантиссы и порядка по принципу QDateTimeEdit.

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

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.131 секунд. Запросов: 23.