#include "FITKSciNotationLineEdit.h" #include #include #include namespace Comp { FITKSciNotationLineEdit::FITKSciNotationLineEdit(QWidget* parent) : QLineEdit(parent) { setAttribute(Qt::WA_AlwaysShowToolTips); //文本编辑控件编辑完成信号连接 connect(this, SIGNAL(editingFinished()), this, SLOT(slot_textChanged())); connect(this, &FITKSciNotationLineEdit::textEdited, this, &FITKSciNotationLineEdit::slot_textEdited); connect(this, &FITKSciNotationLineEdit::textChanged, this, &FITKSciNotationLineEdit::slot_textEdited); } FITKSciNotationLineEdit::~FITKSciNotationLineEdit() { } void FITKSciNotationLineEdit::setValue(double val) { // 保存数值。 _value = val; // 更新文本。 disconnect(this, &FITKSciNotationLineEdit::textChanged, this, &FITKSciNotationLineEdit::slot_textEdited); setText(QString("%1").arg(val)); connect(this, &FITKSciNotationLineEdit::textChanged, this, &FITKSciNotationLineEdit::slot_textEdited); } double FITKSciNotationLineEdit::value() { return _value; } void FITKSciNotationLineEdit::setRange(double* range) { _range[0] = range[0]; _range[1] = range[1]; } bool FITKSciNotationLineEdit::isValidText(QString message, double & value) { bool result = {}; //判断是否为空 if (message.isEmpty())return false; //获取第一个字符串 QString firstChart = message.mid(0, 1); //判断数据是否为负数,qstring::toDouble不支持负数 if (firstChart == "-") { QString stringData = message.remove(0, 1); stringData.toDouble(&result); if (result == true) { double doubleData = stringData.toDouble(); //数据取反 value = doubleData * (-1); return true; } else { return false; } } else { message.toDouble(&result); if (result == true) { value = message.toDouble(&result); return true; } else { return false; } } } QString FITKSciNotationLineEdit::getCurrentValidText() { return _currentValidText; } bool FITKSciNotationLineEdit::getCurrentValidValue(double & value) { return isValidText(_currentValidText, value); } void FITKSciNotationLineEdit::setCurrentValidValue(double value) { _currentValidText = QString::number(value); setText(_currentValidText); } void FITKSciNotationLineEdit::slot_textChanged() { bool result = true; double value; //判断文本是否是有效的科学计数法 result = isValidText(this->text(), value); if (result == true) { //判断数据是否超出范围 if (value < _range[0] || value>_range[1]) { this->setText(_currentValidText); return; } _currentValidText = this->text(); emit dataChanged(); } else { this->setText(_currentValidText); } } void FITKSciNotationLineEdit::slot_textEdited(const QString & text) { _value = text.toDouble(); } }