添加了Double和Float固定长度解析
This commit is contained in:
parent
26821f9543
commit
396a9e31b7
|
|
@ -2,6 +2,9 @@
|
||||||
#include <QSpinBox>
|
#include <QSpinBox>
|
||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
|
#include "TranslateBasic.h"
|
||||||
|
|
||||||
|
using namespace extract;
|
||||||
|
|
||||||
IntDelegate::IntDelegate(int min, int max)
|
IntDelegate::IntDelegate(int min, int max)
|
||||||
: _min_value(min), _max_value(max) {
|
: _min_value(min), _max_value(max) {
|
||||||
|
|
@ -32,7 +35,6 @@ void IntDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewIt
|
||||||
editor->setGeometry(option.rect);
|
editor->setGeometry(option.rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "TranslateBasic.h"
|
|
||||||
void SequenceRulesView::currentRuleRefresh(const QModelIndex& idx)
|
void SequenceRulesView::currentRuleRefresh(const QModelIndex& idx)
|
||||||
{
|
{
|
||||||
auto new_inst = _rule_sequence.at(idx.row());
|
auto new_inst = _rule_sequence.at(idx.row());
|
||||||
|
|
@ -159,6 +161,12 @@ TranslateBasic::TranslateBasic()
|
||||||
u_ptr = std::make_shared<BytesAsHex>();
|
u_ptr = std::make_shared<BytesAsHex>();
|
||||||
_extractor_types[u_ptr->name()] = u_ptr;
|
_extractor_types[u_ptr->name()] = u_ptr;
|
||||||
this->_default_translate_rule = u_ptr;
|
this->_default_translate_rule = u_ptr;
|
||||||
|
|
||||||
|
u_ptr = std::make_shared<BytesAsFloat>();
|
||||||
|
_extractor_types[u_ptr->name()] = u_ptr;
|
||||||
|
|
||||||
|
u_ptr = std::make_shared<BytesAsDouble>();
|
||||||
|
_extractor_types[u_ptr->name()] = u_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<ExtractUnit> TranslateBasic::defaultRule() const
|
std::shared_ptr<ExtractUnit> TranslateBasic::defaultRule() const
|
||||||
|
|
|
||||||
|
|
@ -8,73 +8,9 @@
|
||||||
#include <QTabWidget>
|
#include <QTabWidget>
|
||||||
|
|
||||||
|
|
||||||
BinaryStructView::BinaryStructView(QWidget* p /*= nullptr*/)
|
StructuralRuleView::StructuralRuleView(QWidget* p /*= nullptr*/)
|
||||||
:QWidget(p),
|
:QWidget(p),
|
||||||
_name_enter(new QLineEdit(this)),
|
_sequence_view(new SequenceRulesView(this)),
|
||||||
_base_type(new QComboBox(this)),
|
_configs_stack(new QStackedWidget(this))
|
||||||
_ends_set(new QComboBox(this)),
|
|
||||||
_bin_layout(new QTableView(this)),
|
|
||||||
_bin_model(new QStandardItemModel(this)),
|
|
||||||
_struct_layout(new QTreeView(this)),
|
|
||||||
_struct_model(new QStandardItemModel(this)),
|
|
||||||
_translate_layout(new QTreeView(this)),
|
|
||||||
_translate_model(new QStandardItemModel(this))
|
|
||||||
{
|
{
|
||||||
auto layout = new QGridLayout(this);
|
|
||||||
//layout->setSpacing(10);
|
|
||||||
layout->addWidget(new QLabel(tr("Unit Name:"), this));
|
|
||||||
layout->addWidget(_name_enter, 0, 1);
|
|
||||||
layout->addWidget(new QLabel(tr("Base On:"), this), 0, 2);
|
|
||||||
layout->addWidget(_base_type, 0, 3);
|
|
||||||
layout->addWidget(new QLabel(tr("Basedata Endian Appoint:"), this), 0, 4);
|
|
||||||
layout->addWidget(_ends_set, 0, 5);
|
|
||||||
auto btn = new QPushButton(tr("Save"), this);
|
|
||||||
layout->addWidget(btn, 0, 6);
|
|
||||||
|
|
||||||
auto h_splitter = new QSplitter(Qt::Horizontal, this);
|
|
||||||
layout->addWidget(h_splitter, 1, 0, 3, 7);
|
|
||||||
|
|
||||||
auto splitter = new QSplitter(Qt::Vertical, this);
|
|
||||||
h_splitter->addWidget(splitter);
|
|
||||||
auto translation_panel = new QGroupBox(tr("Translation Detail"), this);
|
|
||||||
auto translation_layout = new QGridLayout(translation_panel);
|
|
||||||
translation_layout->addWidget(this->_translate_layout);
|
|
||||||
h_splitter->addWidget(translation_panel);
|
|
||||||
|
|
||||||
auto bin_panel = new QGroupBox(tr("Sequence Define"));
|
|
||||||
auto bin_layout = new QGridLayout(bin_panel);
|
|
||||||
bin_layout->addWidget(_bin_layout);
|
|
||||||
splitter->addWidget(bin_panel);
|
|
||||||
|
|
||||||
auto struct_panel = new QGroupBox(tr("Structual Preview"), this);
|
|
||||||
auto struct_layout = new QGridLayout(struct_panel);
|
|
||||||
struct_layout->addWidget(_struct_layout);
|
|
||||||
splitter->addWidget(struct_panel);
|
|
||||||
|
|
||||||
// =======================
|
|
||||||
_base_type->addItems(QStringList()<<tr("Struct Based")<<tr("Union Based"));
|
|
||||||
_ends_set->addItems(QStringList() << tr("little-endian") << tr("big-endian"));
|
|
||||||
_bin_layout->setModel(_bin_model);
|
|
||||||
_struct_layout->setModel(_struct_model);
|
|
||||||
_translate_layout->setModel(this->_translate_model);
|
|
||||||
|
|
||||||
_bin_model->setHorizontalHeaderLabels(QStringList() << tr("Member Name") << tr("Logical Type") << tr("Base Type")
|
|
||||||
<< tr("Bytes Offset") << tr("Bytes Count") << tr("Translate Type") << tr("Rule Custom") << tr("Result With"));
|
|
||||||
_bin_model->appendRow(QList<QStandardItem*>() << new QStandardItem(u8"单元标志")<< new QStandardItem(u8"数据")
|
|
||||||
<< new QStandardItem(u8"UINT8") << new QStandardItem("0") << new QStandardItem("1*1")
|
|
||||||
<< new QStandardItem(u8"直译") << new QStandardItem(u8"文本转换") << new QStandardItem(u8"To=16进制"));
|
|
||||||
_bin_model->appendRow(QList<QStandardItem*>() << new QStandardItem(u8"集合尺寸") << new QStandardItem(u8"数据")
|
|
||||||
<< new QStandardItem(u8"UINT16") << new QStandardItem("0") << new QStandardItem(u8"2*1")
|
|
||||||
<< new QStandardItem(u8"直译") << new QStandardItem(u8"数值提取") << new QStandardItem(u8"To=int,LSB=10"));
|
|
||||||
_bin_model->appendRow(QList<QStandardItem*>() << new QStandardItem(u8"变长数据") << new QStandardItem(u8"集合")
|
|
||||||
<< new QStandardItem(u8"UINT8") << new QStandardItem("0") << new QStandardItem(u8"1*集合尺寸"));
|
|
||||||
_bin_model->appendRow(QList<QStandardItem*>() << new QStandardItem(u8"联合数据") << new QStandardItem(u8"联合")
|
|
||||||
<< new QStandardItem(u8"X联合") << new QStandardItem("0") << new QStandardItem(u8"8*1"));
|
|
||||||
|
|
||||||
_struct_model->setHorizontalHeaderLabels(QStringList() << tr("Fields") << tr("Comment"));
|
|
||||||
|
|
||||||
|
|
||||||
_translate_model->setHorizontalHeaderLabels(QStringList() << tr("Apply Condition") << tr("Translate Type") << tr("RuleBase") << tr("Result With"));
|
|
||||||
_translate_model->appendRow(QList< QStandardItem*>() << new QStandardItem(u8"绑定") << new QStandardItem(u8"直译") << new QStandardItem(u8"数值转换") << new QStandardItem(u8"To=16进制"));
|
|
||||||
_translate_model->appendRow(QList< QStandardItem*>() << new QStandardItem(u8"绑定") << new QStandardItem(u8"直译") << new QStandardItem(u8"数值转换") << new QStandardItem(u8"To=float,LSB=0.1"));
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,22 +4,17 @@
|
||||||
#include <QStandardItemModel>
|
#include <QStandardItemModel>
|
||||||
#include <QTreeView>
|
#include <QTreeView>
|
||||||
#include <QLineEdit>
|
#include <QLineEdit>
|
||||||
|
#include <QStackedWidget>
|
||||||
|
#include "SequenceView.h"
|
||||||
|
|
||||||
class BinaryStructView : public QWidget
|
class StructuralRuleView : public QWidget
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
QLineEdit *const _name_enter;
|
SequenceRulesView *const _sequence_view;
|
||||||
QComboBox *const _base_type;
|
QStackedWidget *const _configs_stack;
|
||||||
QComboBox *const _ends_set;
|
|
||||||
QTableView *const _bin_layout;
|
|
||||||
QStandardItemModel* const _bin_model;
|
|
||||||
QTreeView* const _struct_layout;
|
|
||||||
QStandardItemModel* const _struct_model;
|
|
||||||
QTreeView* const _translate_layout;
|
|
||||||
QStandardItemModel* const _translate_model;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BinaryStructView(QWidget* p = nullptr);
|
StructuralRuleView(QWidget* p = nullptr);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,8 @@
|
||||||
#include "TranslateBasic.h"
|
#include "TranslateBasic.h"
|
||||||
|
|
||||||
|
using namespace extract;
|
||||||
|
using namespace convert;
|
||||||
|
|
||||||
AbstractExtractor::AbstractExtractor(const QString& name, DataType data)
|
AbstractExtractor::AbstractExtractor(const QString& name, DataType data)
|
||||||
:_name_store(name), _type_store(data), _byte_offset(0), _byte_count(0) {
|
:_name_store(name), _type_store(data), _byte_offset(0), _byte_count(0) {
|
||||||
}
|
}
|
||||||
|
|
@ -321,3 +324,47 @@ std::shared_ptr<Serializable> DoubleWithLSB::newDefault() const
|
||||||
{
|
{
|
||||||
return std::make_shared<DoubleWithLSB>();
|
return std::make_shared<DoubleWithLSB>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QVariant BytesAsFloat::parse(const QByteArray& bytes) const
|
||||||
|
{
|
||||||
|
return *((float*)bytes.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Serializable> BytesAsFloat::newDefault() const
|
||||||
|
{
|
||||||
|
return std::make_shared<BytesAsFloat>();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BytesAsFloat::setCountWithinParse(int bytes)
|
||||||
|
{
|
||||||
|
AbstractExtractor::setCountWithinParse(4);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
BytesAsFloat::BytesAsFloat()
|
||||||
|
:AbstractExtractor(NAME(BytesAsFloat), DataType::Flt32)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Serializable> BytesAsDouble::newDefault() const
|
||||||
|
{
|
||||||
|
return std::make_shared<BytesAsDouble>();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant BytesAsDouble::parse(const QByteArray& bytes) const
|
||||||
|
{
|
||||||
|
return *((double*)bytes.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BytesAsDouble::setCountWithinParse(int bytes)
|
||||||
|
{
|
||||||
|
AbstractExtractor::setCountWithinParse(8);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
BytesAsDouble::BytesAsDouble()
|
||||||
|
:AbstractExtractor(NAME(BytesAsDouble), DataType::Dbl64)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <QHash>
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 序列化实体
|
/// 序列化实体
|
||||||
|
|
@ -26,7 +27,6 @@ public:
|
||||||
virtual std::shared_ptr<Serializable> newDefault() const = 0;
|
virtual std::shared_ptr<Serializable> newDefault() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 内部使用的数据类型
|
/// 内部使用的数据类型
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -38,6 +38,9 @@ enum class DataType {
|
||||||
Dbl64,
|
Dbl64,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 翻译单元抽象接口
|
/// 翻译单元抽象接口
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -76,13 +79,14 @@ public:
|
||||||
virtual QVariant parse(const QByteArray& bytes) const = 0;
|
virtual QVariant parse(const QByteArray& bytes) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AbstractExtractor : public ExtractUnit {
|
namespace extract {
|
||||||
private:
|
class AbstractExtractor : public ExtractUnit {
|
||||||
|
private:
|
||||||
QString _name_store;
|
QString _name_store;
|
||||||
DataType _type_store;
|
DataType _type_store;
|
||||||
int _byte_offset, _byte_count;
|
int _byte_offset, _byte_count;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AbstractExtractor(const QString& name, DataType data);
|
AbstractExtractor(const QString& name, DataType data);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设置偏移字节数量
|
/// 设置偏移字节数量
|
||||||
|
|
@ -104,34 +108,35 @@ public:
|
||||||
// Serializable ==============================
|
// Serializable ==============================
|
||||||
void loadFrom(const QJsonObject& obj) override;
|
void loadFrom(const QJsonObject& obj) override;
|
||||||
void saveTo(QJsonObject& obj) const override;
|
void saveTo(QJsonObject& obj) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NAME(u) #u
|
#define NAME(u) #u
|
||||||
#define INT32_SAVE(varx) obj[NAME(varx)] = varx;
|
#define INT32_SAVE(varx) obj[NAME(varx)] = varx;
|
||||||
#define INT32_PEAK(varx) varx = obj[NAME(varx)].toInt();
|
#define INT32_PEAK(varx) varx = obj[NAME(varx)].toInt();
|
||||||
#define STRLIST_SAVE(list) obj[NAME(list)] = list.join(";");
|
#define STRLIST_SAVE(list) obj[NAME(list)] = list.join(";");
|
||||||
#define STRLIST_PEAK(list) list = obj[NAME(list)].toString().split(";");
|
#define STRLIST_PEAK(list) list = obj[NAME(list)].toString().split(";");
|
||||||
|
#define STRING_PEAK(codec_name) codec_name = obj[NAME(codec_name)].toString();
|
||||||
|
#define STRING_SAVE(codec_name) obj[NAME(codec_name)] = codec_name;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 转换源数值未16进制数值,默认分割方式
|
/// 转换源数值未16进制数值,默认分割方式
|
||||||
/// </summary>
|
/// </summary>
|
||||||
class BytesAsHex : public AbstractExtractor {
|
class BytesAsHex : public AbstractExtractor {
|
||||||
public:
|
public:
|
||||||
BytesAsHex();
|
BytesAsHex();
|
||||||
|
|
||||||
QVariant parse(const QByteArray& bytes) const override;
|
QVariant parse(const QByteArray& bytes) const override;
|
||||||
std::shared_ptr<Serializable> newDefault() const override;
|
std::shared_ptr<Serializable> newDefault() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#include <QHash>
|
/// <summary>
|
||||||
/// <summary>
|
/// 转换源数值为位联合
|
||||||
/// 转换源数值为位联合
|
/// </summary>
|
||||||
/// </summary>
|
class BytesAsBitCombine : public AbstractExtractor {
|
||||||
class BytesAsBitCombine : public AbstractExtractor {
|
private:
|
||||||
private:
|
|
||||||
QHash<int, QString> _switch_options;
|
QHash<int, QString> _switch_options;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BytesAsBitCombine();
|
BytesAsBitCombine();
|
||||||
|
|
||||||
bool setSwitchOption(int bit_index, const QString& keyword);
|
bool setSwitchOption(int bit_index, const QString& keyword);
|
||||||
|
|
@ -145,16 +150,16 @@ public:
|
||||||
void loadFrom(const QJsonObject& obj) override;
|
void loadFrom(const QJsonObject& obj) override;
|
||||||
void saveTo(QJsonObject& obj) const override;
|
void saveTo(QJsonObject& obj) const override;
|
||||||
std::shared_ptr<Serializable> newDefault() const override;
|
std::shared_ptr<Serializable> newDefault() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 转换源数据为整形
|
/// 转换源数据为整形
|
||||||
/// </summary>
|
/// </summary>
|
||||||
class BytesAsInteger : public AbstractExtractor {
|
class BytesAsInteger : public AbstractExtractor {
|
||||||
private:
|
private:
|
||||||
bool unsigned_mark = false;
|
bool unsigned_mark = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BytesAsInteger();
|
BytesAsInteger();
|
||||||
|
|
||||||
void setUnsignedMark(bool ste);
|
void setUnsignedMark(bool ste);
|
||||||
|
|
@ -168,18 +173,16 @@ public:
|
||||||
void loadFrom(const QJsonObject& obj) override;
|
void loadFrom(const QJsonObject& obj) override;
|
||||||
void saveTo(QJsonObject& obj) const override;
|
void saveTo(QJsonObject& obj) const override;
|
||||||
std::shared_ptr<Serializable> newDefault() const override;
|
std::shared_ptr<Serializable> newDefault() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define STRING_PEAK(codec_name) codec_name = obj[NAME(codec_name)].toString();
|
/// <summary>
|
||||||
#define STRING_SAVE(codec_name) obj[NAME(codec_name)] = codec_name;
|
/// 转换源数据为字符串
|
||||||
/// <summary>
|
/// </summary>
|
||||||
/// 转换源数据为字符串
|
class BytesAsString : public AbstractExtractor {
|
||||||
/// </summary>
|
private:
|
||||||
class BytesAsString : public AbstractExtractor {
|
|
||||||
private:
|
|
||||||
QTextCodec* _conv_with = nullptr;
|
QTextCodec* _conv_with = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BytesAsString();
|
BytesAsString();
|
||||||
|
|
||||||
void setStrCodec(QTextCodec* ins);
|
void setStrCodec(QTextCodec* ins);
|
||||||
|
|
@ -192,7 +195,39 @@ public:
|
||||||
void loadFrom(const QJsonObject& obj) override;
|
void loadFrom(const QJsonObject& obj) override;
|
||||||
void saveTo(QJsonObject& obj) const override;
|
void saveTo(QJsonObject& obj) const override;
|
||||||
std::shared_ptr<Serializable> newDefault() const override;
|
std::shared_ptr<Serializable> newDefault() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class BytesAsFloat : public AbstractExtractor {
|
||||||
|
public:
|
||||||
|
BytesAsFloat();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置解析字节数量
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="bytes"></param>
|
||||||
|
virtual bool setCountWithinParse(int bytes) override;
|
||||||
|
|
||||||
|
QVariant parse(const QByteArray& bytes) const override;
|
||||||
|
std::shared_ptr<Serializable> newDefault() const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BytesAsDouble : public AbstractExtractor {
|
||||||
|
public:
|
||||||
|
BytesAsDouble();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置解析字节数量
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="bytes"></param>
|
||||||
|
virtual bool setCountWithinParse(int bytes) override;
|
||||||
|
|
||||||
|
QVariant parse(const QByteArray& bytes) const override;
|
||||||
|
std::shared_ptr<Serializable> newDefault() const override;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 数值转换抽象接口
|
/// 数值转换抽象接口
|
||||||
|
|
@ -204,16 +239,17 @@ public:
|
||||||
virtual QString name() const = 0;
|
virtual QString name() const = 0;
|
||||||
virtual DataType inType() const = 0;
|
virtual DataType inType() const = 0;
|
||||||
virtual DataType outType() const = 0;
|
virtual DataType outType() const = 0;
|
||||||
virtual QVariant convert(const QVariant &value) const = 0;
|
virtual QVariant convert(const QVariant& value) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AbstractValueConvert : public ValueConvert {
|
namespace convert {
|
||||||
private:
|
class AbstractValueConvert : public ValueConvert {
|
||||||
|
private:
|
||||||
QString _name_store;
|
QString _name_store;
|
||||||
DataType _in_type, _out_type;
|
DataType _in_type, _out_type;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AbstractValueConvert(const QString &nm, DataType in, DataType out);
|
AbstractValueConvert(const QString& nm, DataType in, DataType out);
|
||||||
|
|
||||||
QString name() const override;
|
QString name() const override;
|
||||||
DataType inType() const override;
|
DataType inType() const override;
|
||||||
|
|
@ -221,14 +257,14 @@ public:
|
||||||
|
|
||||||
void loadFrom(const QJsonObject& obj) override;
|
void loadFrom(const QJsonObject& obj) override;
|
||||||
void saveTo(QJsonObject& obj) const override;
|
void saveTo(QJsonObject& obj) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class DoubleWithLSB : public AbstractValueConvert {
|
class DoubleWithLSB : public AbstractValueConvert {
|
||||||
private:
|
private:
|
||||||
double _lsb_value;
|
double _lsb_value;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DoubleWithLSB();
|
DoubleWithLSB();
|
||||||
|
|
||||||
void setLSB(double lsbv);
|
void setLSB(double lsbv);
|
||||||
|
|
@ -236,4 +272,5 @@ public:
|
||||||
|
|
||||||
QVariant convert(const QVariant& value) const override;
|
QVariant convert(const QVariant& value) const override;
|
||||||
std::shared_ptr<Serializable> newDefault() const override;
|
std::shared_ptr<Serializable> newDefault() const override;
|
||||||
};
|
};
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue