修复了json editdialog保存无效

This commit is contained in:
2025-10-16 17:04:30 +08:00
parent 21d8ef8c34
commit 08f3890ac4
+73 -41
View File
@@ -136,7 +136,15 @@ public:
JsonValueType valueType = getJsonValueType(value);
m_originalTypes[key] = valueType;
// 设置值
////为所有类型都创建数据项
//QString valueText = formatValueForDisplay(value, valueType);
//QStandardItem* valueItem = new QStandardItem(valueText);
//valueItem->setToolTip(generateTypeHint(valueType));
//valueItem->setBackground(QColor(60, 60, 60));
//valueItem->setForeground(QColor(255, 255, 255));
//m_tableModel->setItem(row, 1, valueItem);
//为特定类型创建专用编辑器控件
QWidget* editorWidget = createEditorWidget(value, valueType);
if (editorWidget) {
m_tableView->setIndexWidget(m_tableModel->index(row, 1), editorWidget);
@@ -192,6 +200,8 @@ private slots:
result[keyStd] = convertedValue;
}
qDebug() << "Result JSON: " << QString::fromStdString(result.dump(4));
emit jsonAccepted(result);
accept();
}
@@ -240,54 +250,62 @@ private:
}
}
// 从编辑器控件获取值并验证
bool getValueFromEditor(const std::string& key, JsonValueType expectedType,
nlohmann::json& result, QString& errorMsg) {
bool getValueFromEditor(const std::string& key, JsonValueType expectedType, nlohmann::json& result, QString& errorMsg) {
auto it = m_editorWidgets.find(key);
if (it == m_editorWidgets.end()) {
// 没有编辑器控件,使用默认文本处理
return validateAndConvertValue(getTextFromCell(key), expectedType, result, errorMsg);
}
QWidget* widget = it->second;
try {
switch (expectedType) {
case JsonValueType::Boolean: {
CircularSwitch* switchBtn = qobject_cast<CircularSwitch*>(widget);
if (switchBtn) {
result = switchBtn->isChecked();
return true;
}
errorMsg = "布尔值控件类型错误";
return false;
}
case JsonValueType::Number: {
QDoubleSpinBox* spinBox = qobject_cast<QDoubleSpinBox*>(widget);
if (spinBox) {
// 检查是否为整数
double value = spinBox->value();
if (spinBox->decimals() == 0 && value == floor(value)) {
result = static_cast<int64_t>(value);
}
else {
if (it != m_editorWidgets.end()) {
// 有专用编辑器控件
QWidget* widget = it->second;
switch (expectedType) {
case JsonValueType::Boolean: {
CircularSwitch* switchBtn = qobject_cast<CircularSwitch*>(widget);
if (switchBtn) {
bool value = switchBtn->isChecked();
result = value;
// 更新模型数据
updateModelData(key, value ? "true" : "false");
return true;
}
return true;
errorMsg = "布尔值控件类型错误";
return false;
}
errorMsg = "数字控件类型错误";
return false;
}
case JsonValueType::String: {
QLineEdit* lineEdit = qobject_cast<QLineEdit*>(widget);
if (lineEdit) {
result = lineEdit->text().trimmed().toStdString();
return true;
case JsonValueType::Number: {
QDoubleSpinBox* spinBox = qobject_cast<QDoubleSpinBox*>(widget);
if (spinBox) {
double value = spinBox->value();
// 检查是否为整数
if (spinBox->decimals() == 0 && value == floor(value)) {
result = static_cast<int64_t>(value);
updateModelData(key, QString::number(static_cast<int64_t>(value)));
}
else {
result = value;
updateModelData(key, QString::number(value));
}
return true;
}
errorMsg = "数字控件类型错误";
return false;
}
case JsonValueType::String: {
QLineEdit* lineEdit = qobject_cast<QLineEdit*>(widget);
if (lineEdit) {
QString value = lineEdit->text().trimmed();
result = value.toStdString();
updateModelData(key, value);
return true;
}
errorMsg = "字符串控件类型错误";
return false;
}
default:
// 其他类型使用默认文本处理
return validateAndConvertValue(getTextFromCell(key), expectedType, result, errorMsg);
}
errorMsg = "字符串控件类型错误";
return false;
}
default:
// 其他类型使用默认文本处理
else {
// 没有专用编辑器控件,使用默认文本处理
return validateAndConvertValue(getTextFromCell(key), expectedType, result, errorMsg);
}
}
@@ -297,6 +315,20 @@ private:
}
}
// 更新模型中的数据项
void updateModelData(const std::string& key, const QString& value) {
for (int row = 0; row < m_tableModel->rowCount(); ++row) {
QStandardItem* keyItem = m_tableModel->item(row, 0);
if (keyItem && keyItem->text().toStdString() == key) {
QStandardItem* valueItem = m_tableModel->item(row, 1);
if (valueItem) {
valueItem->setText(value);
}
break;
}
}
}
// 从单元格获取文本值(用于没有专用编辑器的类型)
QString getTextFromCell(const std::string& key) {
//查找键对应的行