Ситуация такая:
Есть некое значение min и max. Соответственно имеются setMin и setMax.
Для простоты рассмотрим только setMax:
Реализовано два сигнала и два слота для переменной m_max
public signal:
void setMax(double val){
if( !(m_max<=val+EPS && m_max>=val-EPS) ){
m_max=val;
emit maxChanged(m_max);
emit maxChanged(number(m_max));
}
}
bool setMax(QString val){
bool ok = false;
double dmax = val.toDouble(&ok);
if(ok)
setMax(dmax);
return ok;
}
QString AxisProperty::number(double val){
return QString::number(val, 'g', getPrecision());
}
signals:
void maxChanged(double);
void maxChanged(QString);
Ф-я getPrecision() вощзвращает необходимое колличество знаков, по умолчанию это 6.
Данные сигналы и слоты соединены с сигналами и слотами QLineEdit, соответственно, при вызове setMax(double val) в программе, по сигналу maxChanged(QString) вызывается слот QLineEdit::setText(QString), тут дергается сигнал QLineEdit::textChanged(QString), на котором висит слот setMax(QString val).
Проблема в том, что если число, заданное в программе функцией setMax(double val), было
точнее, чем точность, указная функцией getPrecision(), то при вызове из формы слота setMax(QString val) проверка покажет что число изменилось и будет установленное новое число.
При сравнениии вещественных числел в данном случае не помогает EPS, т.к. если, допустим, у меня есть число с 6ю знаками
до запятой, то при getPrecision()==6 в QString будет записано, по сути, целое число. Изменить или увеличить значение getPrecision() нельзя, т.к. важно, сколько символов будет отображено в QLineEdit. В то же время в программе важно хранить более точное значение.
Мне в голову пришло такое решение: в слоте setMax(QString val) сравнивать значения как строки, но тут другая проблема:
если есть число 123.456 и оно будет выведено на экран как 123.456, а потом пользователь отредактирует его до 123, то число не перезапишется, т.к. алгоритм будет считать, что в программе число более точное, а на самом деле оно просто
другое.
Какие Вы видите решения проблемы?
Спасибо)