#include #include #include #include #include #include #include #include "structDataPropertyDelegate.h" #include "structDataPropertyModel.h" #include "uiCommunicationBus.h" StructDataPropertyDelegate::StructDataPropertyDelegate(QObject* parent) : QStyledItemDelegate(parent) {} QWidget* StructDataPropertyDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const { Q_UNUSED(option); int column = index.column(); switch (column) { case StructDataPropertyModel::ColConnectPara: return createConnectParaEditor(parent); case StructDataPropertyModel::ColDefaultValue: return createDefaultValueEditor(parent, index); case StructDataPropertyModel::ColLengthPrecision: return createLengthPrecisionEditor(parent); } return nullptr; } void StructDataPropertyDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { int column = index.column(); QVariant value = index.data(Qt::EditRole); switch (column) { case StructDataPropertyModel::ColConnectPara: if (QLineEdit* lineEdit = qobject_cast(editor)) { lineEdit->setText(value.toString()); } break; case StructDataPropertyModel::ColDefaultValue: setDefaultValueEditorData(editor, value, index); break; case StructDataPropertyModel::ColLengthPrecision: if (QSpinBox* spinBox = qobject_cast(editor)) { spinBox->setValue(value.toInt()); } break; } } void StructDataPropertyDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const { int column = index.column(); QVariant newValue; switch (column) { case StructDataPropertyModel::ColConnectPara: if (QLineEdit* lineEdit = qobject_cast(editor)) { newValue = lineEdit->text().trimmed(); } break; case StructDataPropertyModel::ColDefaultValue: newValue = getDefaultValueEditorData(editor, index); break; case StructDataPropertyModel::ColLengthPrecision: if (QSpinBox* spinBox = qobject_cast(editor)) { newValue = spinBox->value(); } break; } if (!newValue.isNull()) { model->setData(index, newValue, Qt::EditRole); } } void StructDataPropertyDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const { Q_UNUSED(index); editor->setGeometry(option.rect); } QString StructDataPropertyDelegate::displayText(const QVariant& value, const QLocale& locale) const { Q_UNUSED(locale); // 格式化显示文本 if (value.userType() == QMetaType::Bool) { return value.toBool() ? "是" : "否"; } return QStyledItemDelegate::displayText(value, locale); } QWidget* StructDataPropertyDelegate::createConnectParaEditor(QWidget* parent) const { QLineEdit* lineEdit = new QLineEdit(parent); lineEdit->setMaxLength(150); lineEdit->installEventFilter(const_cast(this)); lineEdit->setPlaceholderText("空格获取初始值"); lineEdit->setCompleter(_connectCompleter); connect(lineEdit, &QLineEdit::textChanged, this, [=](const QString &text) { if (text.endsWith(".")) { onConnectParamChanged(text); } }); return lineEdit; } QWidget* StructDataPropertyDelegate::createDefaultValueEditor(QWidget* parent, const QModelIndex& index) const { // 根据数据类型创建不同的编辑器 QString dataType = index.sibling(index.row(), StructDataPropertyModel::ColDataType).data().toString().toLower(); if (dataType == "int" || dataType == "integer") { QSpinBox* spinBox = new QSpinBox(parent); spinBox->setRange(-999999, 999999); return spinBox; } else if (dataType == "float" || dataType == "double") { QDoubleSpinBox* spinBox = new QDoubleSpinBox(parent); spinBox->setRange(-999999.0, 999999.0); spinBox->setDecimals(3); return spinBox; } else if (dataType == "bool" || dataType == "boolean") { QComboBox* comboBox = new QComboBox(parent); comboBox->addItems({"false", "true"}); return comboBox; } else { // 字符串或其他类型 QLineEdit* lineEdit = new QLineEdit(parent); return lineEdit; } } QWidget* StructDataPropertyDelegate::createLengthPrecisionEditor(QWidget* parent) const { QSpinBox* spinBox = new QSpinBox(parent); spinBox->setRange(0, 999); spinBox->setSpecialValueText("无限制"); return spinBox; } void StructDataPropertyDelegate::setDefaultValueEditorData(QWidget* editor, const QVariant& value, const QModelIndex& index) const { QString dataType = index.sibling(index.row(), StructDataPropertyModel::ColDataType).data().toString().toLower(); if (QSpinBox* spinBox = qobject_cast(editor)) { spinBox->setValue(value.toInt()); } else if (QDoubleSpinBox* doubleSpinBox = qobject_cast(editor)) { doubleSpinBox->setValue(value.toDouble()); } else if (QComboBox* comboBox = qobject_cast(editor)) { bool boolValue = value.toBool(); comboBox->setCurrentIndex(boolValue ? 1 : 0); } else if (QLineEdit* lineEdit = qobject_cast(editor)) { lineEdit->setText(value.toString()); } } QVariant StructDataPropertyDelegate::getDefaultValueEditorData(QWidget* editor, const QModelIndex& index) const { QString dataType = index.sibling(index.row(), StructDataPropertyModel::ColDataType).data().toString().toLower(); if (QSpinBox* spinBox = qobject_cast(editor)) { return spinBox->value(); } else if (QDoubleSpinBox* doubleSpinBox = qobject_cast(editor)) { return doubleSpinBox->value(); } else if (QComboBox* comboBox = qobject_cast(editor)) { return comboBox->currentIndex() == 1; } else if (QLineEdit* lineEdit = qobject_cast(editor)) { return lineEdit->text(); } return QVariant(); } void StructDataPropertyDelegate::onConnectParamChanged(const QString& str) const { QVariantMap map; map.insert("input",str); UiCommunicationBus::instance()->sendHttpRequest("/measurement/recommend",QVariant(),"GET",map); } bool StructDataPropertyDelegate::eventFilter(QObject *obj, QEvent *event) { if (QLineEdit *editor = qobject_cast(obj)){ if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast(event); if (keyEvent->key() == Qt::Key_Space) { qDebug() << "eventFilter:space"; onConnectParamChanged(editor->text()); _connectCompleter->complete(); return true; } if (keyEvent->text() == ".") { qDebug() << "eventFilter:dot"; // 返回false让事件继续传播 } } } return QStyledItemDelegate::eventFilter(obj, event); }