#include "propertyContentDlg.h" #include "baseProperty.h" #include #include #include #include #include #include PropertyContentDlg::PropertyContentDlg(QWidget *parent) : BaseContentDlg(parent) { _layout = new QVBoxLayout(this); } PropertyContentDlg::~PropertyContentDlg() { } void PropertyContentDlg::createGroupView(groupStateInfo infos) { QScrollArea* scrollArea = new QScrollArea(this); QWidget* content = new QWidget(); QFormLayout* formLayout = createFormLayout(content); // 动态生成字段 for(auto& info:infos.info) { QLabel* label = new QLabel(info.name,this); QWidget* editor = createEditor(info); formLayout->addRow(label, editor); } scrollArea->setWidget(content); scrollArea->setWidgetResizable(true); _layout->addWidget(scrollArea); } QWidget* PropertyContentDlg::createEditor(propertyStateInfo pro) { QWidget* pWidget = nullptr; if(pro.type.contains("SMALLINT")) { QSpinBox* spin = new QSpinBox(this); if(pro.lengthPrecision > 0) spin->setRange(-pro.lengthPrecision,pro.lengthPrecision); else spin->setRange(-32768, 32767); pWidget = spin; } else if(pro.type.contains("INTEGER")) { QSpinBox* spin = new QSpinBox(this); if(pro.lengthPrecision > 0) spin->setRange(-pro.lengthPrecision,pro.lengthPrecision); else spin->setRange(-32768,32767); pWidget = spin; } else if(pro.type.contains("BIGINT")) { QLineEdit *lineEdit = new QLineEdit(this); QRegularExpression regExp("^[+-]?(0|[1-9][0-9]{0,18})$"); QRegularExpressionValidator *validator = new QRegularExpressionValidator(regExp, this); lineEdit->setValidator(validator); pWidget = lineEdit; } else if(pro.type.contains("REAL")) { QDoubleSpinBox* dbSpin = new QDoubleSpinBox(this); dbSpin->setDecimals(4); if(pro.lengthPrecision > 0) dbSpin->setRange(-pro.lengthPrecision,pro.lengthPrecision); else dbSpin->setRange(-9999999,9999999); pWidget = dbSpin; } else if(pro.type.contains("DOUBLE PRECISION")) { QDoubleSpinBox* dbSpin = new QDoubleSpinBox(this); dbSpin->setDecimals(8); if(pro.lengthPrecision > 0) dbSpin->setRange(-pro.lengthPrecision,pro.lengthPrecision); else dbSpin->setRange(-9999999,9999999); pWidget = dbSpin; } else if(pro.type.contains("NUMERIC") || pro.type.contains("DECIMAL")) { QLineEdit *lineEdit = new QLineEdit(this); // 正则表达式:支持正负号、整数/小数、科学计数法 QRegularExpression regExp( "^[+-]?" // 可选正负号 "(?:0|[1-9]\\d*)(?:\\.\\d+)?" // 整数部分(避免前导零)和小数部分 "(?:[eE][+-]?\\d+)?" // 科学计数法(如e5, E-3) ); QRegularExpressionValidator *validator = new QRegularExpressionValidator(regExp, this); lineEdit->setValidator(validator); pWidget = lineEdit; } else if(pro.type.contains("SERIAL") || pro.type.contains("BIGSERIAL")) { QLabel *label = new QLabel(this); pWidget = label; } else if(pro.type.contains("CHAR") || pro.type.contains("VARCHAR")) { QLineEdit *lineEdit = new QLineEdit(this); lineEdit->setMaxLength(pro.lengthPrecision); pWidget = lineEdit; } else if(pro.type.contains("TEXT")) { QLineEdit *lineEdit = new QLineEdit(this); pWidget = lineEdit; } else if(pro.type.contains("BYTEA")) { //todo:二进制文件上传 QLabel *label = new QLabel(this); pWidget = label; } else if(pro.type.contains("DATE")) { QDateEdit* dateEdit = new QDateEdit(this); dateEdit->setDisplayFormat("yyyy-MM-dd"); pWidget = dateEdit; } else if(pro.type.contains("TIME")) { QTimeEdit* timeEdit = new QTimeEdit(this); timeEdit->setDisplayFormat("HH:mm:ss"); pWidget = timeEdit; } else if(pro.type.contains("TIMESTAMP")) { QDateTimeEdit* dateTimeEidt = new QDateTimeEdit(this); dateTimeEidt->setDisplayFormat("yyyy-MM-dd HH:mm:ss"); pWidget = dateTimeEidt; } else if(pro.type.contains("UUID")) { QLineEdit *lineEdit = new QLineEdit(this); QRegularExpression regExp("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"); QRegularExpressionValidator *validator = new QRegularExpressionValidator(regExp, this); lineEdit->setValidator(validator); pWidget = lineEdit; } else if(pro.type.contains("JSON") || pro.type.contains("JSONB")) { QLineEdit *lineEdit = new QLineEdit(this); pWidget = lineEdit; } if(pWidget) { pWidget->setProperty("name",pro.name); propertyContentInfo info; info.proName = pro.name; info.proType = pro.type; info.proEditer = pWidget; _mapPro.insert(pro.name,info); } return pWidget; } QMap PropertyContentDlg::getPropertyValue(BaseProperty* pPro) { QMap map; for(auto &pro:_mapPro) { propertyStateInfo info; info.type = pro.proType; info.name = pro.proName; if(pro.proEditer != nullptr) { if(pro.proType.contains("SMALLINT") || pro.proType.contains("INTEGER")) { QSpinBox* spin = qobject_cast(pro.proEditer); if(spin) info.defaultValue = spin->value(); } else if(pro.proType.contains("BIGINT")) { QLineEdit* lineEdit = qobject_cast(pro.proEditer); if(lineEdit) info.defaultValue = lineEdit->text(); } else if(pro.proType.contains("REAL") || pro.proType.contains("DOUBLE PRECISION")) { QDoubleSpinBox* dbSpin = qobject_cast(pro.proEditer); if(dbSpin) info.defaultValue = dbSpin->value(); } else if(pro.proType.contains("NUMERIC") || pro.proType.contains("DECIMAL")) { QLineEdit* lineEdit = qobject_cast(pro.proEditer); if(lineEdit) info.defaultValue = lineEdit->text(); } else if(pro.proType.contains("SERIAL") || pro.proType.contains("BIGSERIAL")) { QLabel* label = qobject_cast(pro.proEditer); if(label) info.defaultValue = label->text(); } else if(pro.proType.contains("CHAR") || pro.proType.contains("VARCHAR")) { QLineEdit* lineEdit = qobject_cast(pro.proEditer); if(lineEdit) info.defaultValue = lineEdit->text(); } else if(pro.proType.contains("TEXT")) { QLineEdit* lineEdit = qobject_cast(pro.proEditer); if(lineEdit) info.defaultValue = lineEdit->text(); } else if(pro.proType.contains("BYTEA")) { QLabel* label = qobject_cast(pro.proEditer); if(label) info.defaultValue = label->text(); } else if(pro.proType.contains("DATE")) { QDateEdit* dateEdit = qobject_cast(pro.proEditer); if(dateEdit) info.defaultValue = dateEdit->text(); } else if(pro.proType.contains("TIME")) { QTimeEdit* timeEdit = qobject_cast(pro.proEditer); if(timeEdit) info.defaultValue = timeEdit->text(); } else if(pro.proType.contains("TIMESTAMP")) { QDateTimeEdit* dateTimeEidt = qobject_cast(pro.proEditer); if(dateTimeEidt) info.defaultValue = dateTimeEidt->text(); } else if(pro.proType.contains("UUID")) { QLineEdit* lineEdit = qobject_cast(pro.proEditer); if(lineEdit) info.defaultValue = lineEdit->text(); } else if(pro.proType.contains("JSON") || pro.proType.contains("JSONB")) { QLineEdit* lineEdit = qobject_cast(pro.proEditer); if(lineEdit) info.defaultValue = lineEdit->text(); } map.insert(pro.proName,info); } } for(auto it = map.begin();it != map.end();++it) //值被手动改变过,锁定(保存后解除锁定 { if(_curValue.contains(it.key())) { if(it->defaultValue != _curValue.value(it.key()).defaultValue) { it->lock = true; } } } pPro->setDataChanged(true); return map; } void PropertyContentDlg::setPropertyValue(QVariant var) { QMap map = var.value>(); _curValue = map; for(auto &info:map) { propertyContentInfo pro = _mapPro[info.name]; if(info.type.contains("SMALLINT") || info.type.contains("INTEGER")) { QSpinBox* spin = qobject_cast(pro.proEditer); if(spin) spin->setValue(info.defaultValue.toInt()); } else if(info.type.contains("BIGINT")) { QLineEdit* lineEdit = qobject_cast(pro.proEditer); if(lineEdit) lineEdit->setText(info.defaultValue.toString()); } else if(info.type.contains("REAL") || info.type.contains("DOUBLE PRECISION")) { QDoubleSpinBox* dbSpin = qobject_cast(pro.proEditer); if(dbSpin) dbSpin->setValue(info.defaultValue.toDouble()); } else if(info.type.contains("NUMERIC") || info.type.contains("DECIMAL")) { QLineEdit* lineEdit = qobject_cast(pro.proEditer); if(lineEdit) lineEdit->setText(info.defaultValue.toString()); } else if(info.type.contains("SERIAL") || info.type.contains("BIGSERIAL")) { QLabel* label = qobject_cast(pro.proEditer); if(label) label->setText(info.defaultValue.toString()); } else if(info.type.contains("CHAR") || info.type.contains("VARCHAR")) { QLineEdit* lineEdit = qobject_cast(pro.proEditer); if(lineEdit) lineEdit->setText(info.defaultValue.toString()); } else if(info.type.contains("TEXT")) { QLineEdit* lineEdit = qobject_cast(pro.proEditer); if(lineEdit) lineEdit->setText(info.defaultValue.toString()); } else if(info.type.contains("BYTEA")) { QLabel* label = qobject_cast(pro.proEditer); if(label) label->setText(info.defaultValue.toString()); } else if(info.type.contains("DATE")) { QDateEdit* dateEdit = qobject_cast(pro.proEditer); QDate date = QDate::fromString(info.defaultValue.toString(), "yyyy-MM-dd"); if(dateEdit) dateEdit->setDate(date); } else if(info.type.contains("TIME")) { QTimeEdit* timeEdit = qobject_cast(pro.proEditer); QTime time = QTime::fromString(info.defaultValue.toString(), "HH:mm:ss"); if(timeEdit) timeEdit->setTime(time); } else if(info.type.contains("TIMESTAMP")) { QDateTimeEdit* dateTimeEidt = qobject_cast(pro.proEditer); QDateTime dateTime = QDateTime::fromString(info.defaultValue.toString(), "yyyy-MM-dd HH:mm:ss"); if(dateTimeEidt) dateTimeEidt->setDateTime(dateTime); } else if(info.type.contains("UUID")) { QLineEdit* lineEdit = qobject_cast(pro.proEditer); if(lineEdit) lineEdit->setText(info.defaultValue.toString()); } else if(info.type.contains("JSON") || info.type.contains("JSONB")) { QLineEdit* lineEdit = qobject_cast(pro.proEditer); if(lineEdit) lineEdit->setText(info.defaultValue.toString()); } } }