From 293be045c0d2d1735266f2564ee562be0e08d579 Mon Sep 17 00:00:00 2001 From: baiYue Date: Thu, 17 Apr 2025 16:51:20 +0800 Subject: [PATCH] generate project model V0.2 --- CMakeLists.txt | 8 +- common/include/global.h | 21 + common/include/tools.h | 67 ++ diagramUtils/include/dataBase.h | 8 +- diagramUtils/source/dataBase.cpp | 120 +++- include/projectModelDlg.h | 79 ++- include/projectTableDelegate.h | 28 + include/renameModel.h | 6 +- include/selectorDialog.h | 32 + source/projectModelDlg.cpp | 1123 ++++++++++++++++++++++++------ source/projectTableDelegate.cpp | 153 ++++ source/renameModel.cpp | 8 +- source/selectorDialog.cpp | 94 +++ ui/projectModelDlg.ui | 313 +++------ 14 files changed, 1551 insertions(+), 509 deletions(-) create mode 100644 common/include/tools.h create mode 100644 include/projectTableDelegate.h create mode 100644 include/selectorDialog.h create mode 100644 source/projectTableDelegate.cpp create mode 100644 source/selectorDialog.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index a8ab15a..2889cc4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,9 +46,11 @@ set(H_HEADER_FILES include/toolBox.h include/loadPageDlg.h include/projectModelDlg.h - include/renameModel.h + include/projectTableDelegate.h + include/selectorDialog.h common/include/global.h + common/include/tools.h common/include/httpInterface.h common/include/compiler.hpp common/include/export.hpp @@ -67,7 +69,8 @@ set(CPP_SOURCE_FILES source/toolBox.cpp source/loadPageDlg.cpp source/projectModelDlg.cpp - source/renameModel.cpp + source/projectTableDelegate.cpp + source/selectorDialog.cpp common/source/httpInterface.cpp common/source/global.cpp @@ -77,7 +80,6 @@ set(UI_FILES ui/graphicElementsPanel.ui ui/loadPageDlg.ui ui/projectModelDlg.ui - ui/renameModel.ui ) # 包含源文件目录 diff --git a/common/include/global.h b/common/include/global.h index 73c2f1b..0c51088 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -58,6 +58,27 @@ enum Attribute //元模属性字段对照 ValueRange = Qt::UserRole + 9, }; +enum TableDelegateContent //代理内容 +{ + TD_ProjectModel = 0, //工程模 + TD_MetaModel, //基模 + TD_ComponentType //元件类型 +}; + +enum SelectorDialogType //选择dialog类型 +{ + ST_MetaModel = 0, //元模对话框 + ST_ComponentType //元件选择 +}; + +enum TableItemState //工程模table操作的对象状态 +{ + TS_create = 1, + TS_select = 2, + TS_edit = 4 +}; + + struct attributeGroup //属性组(元模) { int id = 0; diff --git a/common/include/tools.h b/common/include/tools.h new file mode 100644 index 0000000..f95cd8c --- /dev/null +++ b/common/include/tools.h @@ -0,0 +1,67 @@ +#ifndef TOOLS_H +#define TOOLS_H + +#include + +template //双向map工具类,实现key->value,value->key的映射 +class BiDirectionalMap { +public: + // 插入键值对,确保双向唯一性 + void insert(const Key& key, const Value& value) { + // 删除旧键和旧值的关联(如果存在) + if (m_keyToValue.contains(key)) { + Value oldValue = m_keyToValue[key]; + m_valueToKey.remove(oldValue); + } + if (m_valueToKey.contains(value)) { + Key oldKey = m_valueToKey[value]; + m_keyToValue.remove(oldKey); + } + // 插入新键值对 + m_keyToValue[key] = value; + m_valueToKey[value] = key; + } + + // 根据键获取值 + Value value(const Key& key) const { + return m_keyToValue.value(key); + } + + // 根据值获取键 + Key key(const Value& value) const { + return m_valueToKey.value(value); + } + + // 检查键是否存在 + bool containsKey(const Key& key) const { + return m_keyToValue.contains(key); + } + + // 检查值是否存在 + bool containsValue(const Value& value) const { + return m_valueToKey.contains(value); + } + + // 通过键删除项 + void removeByKey(const Key& key) { + if (m_keyToValue.contains(key)) { + Value value = m_keyToValue[key]; + m_keyToValue.remove(key); + m_valueToKey.remove(value); + } + } + + // 通过值删除项 + void removeByValue(const Value& value) { + if (m_valueToKey.contains(value)) { + Key key = m_valueToKey[value]; + m_valueToKey.remove(value); + m_keyToValue.remove(key); + } + } + +private: + QHash m_keyToValue; // 键 → 值 + QHash m_valueToKey; // 值 → 键 +}; +#endif // DATABASE_H diff --git a/diagramUtils/include/dataBase.h b/diagramUtils/include/dataBase.h index 50b7fa5..d6e55bc 100644 --- a/diagramUtils/include/dataBase.h +++ b/diagramUtils/include/dataBase.h @@ -15,7 +15,7 @@ class DIAGRAM_DESIGNER_PUBLIC DataBase public: DataBase(); ~DataBase(); - QSqlQuery executeSQL(const QString& strSQL, bool createOrDrop = false,const QVariantList& params = {}, bool useTranscation = false); + QSqlQuery executeSQL(const QString& strSQL, bool isDDl = false,const QVariantList& params = {}, bool useTranscation = false); //ddl:create,delete,alter etc /** * @brief 多条批量SQL语句执行接口 * @param sqlStatements SQL语句列表 @@ -82,9 +82,15 @@ public: QMap getProjectTableName(const QString& sProject); //获取当前工程模型下所有表信息 bool createDynamicTable(const QString&, const QStringList&); bool deleteProjectModel(const QString&); + bool updateProjectName(const QString& newTable,const QString& newPro,const QString& oldTable); //更新mangager工程模名称 + bool alterTableName(const QString& oldTable,const QString& newTable); //修改表名 + bool updateComponentModelName(const QString& strOld,const QString& strNew); //修改component中的模型名 + bool deleteTable(const QString&); //删除表 bool deleteRecordFromManager(const QString& sProject,const QString& sGroup); //删除某个模型下的组 bool modifyProjectTable(QString sTable,QMap mOld,QMap mNew); + + QStringList ifModelOccupy(const QString&); //判断模型是否被使用 //**********使用工程模 QMap getAllProjectModel(); //获取所有工程模<名称,图元类型> QMap getModelInfo(const QString&); //获取模型信息 diff --git a/diagramUtils/source/dataBase.cpp b/diagramUtils/source/dataBase.cpp index f9fc420..41eec7b 100644 --- a/diagramUtils/source/dataBase.cpp +++ b/diagramUtils/source/dataBase.cpp @@ -68,7 +68,7 @@ DataBase* DataBase::GetInstance() return dbInstance; } -QSqlQuery DataBase::executeSQL(const QString& strSQL,bool createOrDrop,const QVariantList& params, bool useTranscation) +QSqlQuery DataBase::executeSQL(const QString& strSQL,bool isDDL,const QVariantList& params, bool useTranscation) { //事务 bool transactionStarted = false; @@ -85,7 +85,7 @@ QSqlQuery DataBase::executeSQL(const QString& strSQL,bool createOrDrop,const QVa QSqlQuery sqlQuery(db); try { - if(createOrDrop) //创建或删除直接执行sql + if(isDDL) //创建或删除直接执行sql { if (!sqlQuery.exec(strSQL)) { @@ -199,12 +199,12 @@ QSqlQuery DataBase::executeBatchSQL(const QStringList& sqlStatements, bool creat } lastQuery = std::move(sqlQuery); - // 提交事务(如果已开启) - if(transactionStarted && !db.commit()) - { - throw std::runtime_error(db.lastError().text().toStdString()); - LOG_ERROR("DB", QString("Commit transaction failed.")); - } + } + // 提交事务(如果已开启) + if(transactionStarted && !db.commit()) + { + throw std::runtime_error(db.lastError().text().toStdString()); + LOG_ERROR("DB", QString("Commit transaction failed.")); } } catch (const std::runtime_error& e) @@ -1311,8 +1311,8 @@ QMap DataBase::getProjectFromManager(const QString& sMeta) { map.insert(tag,nType); } - query.clear(); } + query.clear(); return map; } catch (const std::exception& e) @@ -1324,10 +1324,6 @@ QMap DataBase::getProjectFromManager(const QString& sMeta) QMap DataBase::getCheckStateFromManager(const QString& sProject) { QMap map; - if(sProject == QString::fromWCharArray(L"新建")) - { - return map; - } QString strSQL = "SELECT group_name, check_state FROM project_manager WHERE tag = ?"; QVariantList params; @@ -1430,7 +1426,7 @@ QMap DataBase::getModelInfo(const QString& sProject) QMap DataBase::getProjectModelGroupInfo(const QString& sTable) { QMap map; - QString strSQL = "SELECT * FROM project_manager WHERE tag = ?"; + QString strSQL = "SELECT name,tag,meta_model,group_name,link_type,check_state FROM project_manager WHERE tag = ?"; QVariantList params; params.append(sTable); @@ -1440,13 +1436,12 @@ QMap DataBase::getProjectModelGroupInfo(const QString& s while (query.next()) { projectManager info; - info.id = query.value(0).toInt(); - info.name = query.value(1).toString(); - info.tag = query.value(2).toString(); - info.metaModel = query.value(3).toString(); - info.groupName = query.value(4).toString(); - info.linkType = query.value(5).toInt(); - QString json = query.value(6).toString(); + info.name = query.value(0).toString(); + info.tag = query.value(1).toString(); + info.metaModel = query.value(2).toString(); + info.groupName = query.value(3).toString(); + info.linkType = query.value(4).toInt(); + QString json = query.value(5).toString(); info.checkState = QstringToJson(json); if(!map.contains(info.groupName)) @@ -1527,11 +1522,6 @@ bool DataBase::createDynamicTable(const QString &tableName, const QStringList &f bool DataBase::deleteProjectModel(const QString& sProject) { - if(sProject == QString::fromWCharArray(L"新建")) - { - return false; - } - QStringList lstTable; QString strSQL = "SELECT name FROM project_manager WHERE tag = ?"; QVariantList params; @@ -1596,6 +1586,59 @@ bool DataBase::deleteProjectModel(const QString& sProject) } +bool DataBase::updateProjectName(const QString& newTable,const QString& newPro,const QString& oldTable) +{ + QString strSQL = QString("UPDATE project_manager SET name = ?,tag = ? WHERE name = ?"); + QVariantList params; + params.append(newTable); + params.append(newPro); + params.append(oldTable); + try + { + executeSQL(strSQL,false,params); + return true; + } + catch (const std::exception& e) + { + LOG_ERROR("DB", QString("Update project_manager %1 fail").arg(oldTable)); + return false; + } +} + +bool DataBase::alterTableName(const QString& oldTable,const QString& newTable) +{ + QString strSQL = QString("ALTER TABLE %1 RENAME TO %2").arg(oldTable,newTable); + QVariantList params; + try + { + executeSQL(strSQL,true); + return true; + } + catch (const std::exception& e) + { + LOG_ERROR("DB", QString("ALTER TABLE %1 fail").arg(oldTable)); + return false; + } +} + +bool DataBase::updateComponentModelName(const QString& strOld,const QString& strNew) +{ + QString strSQL = QString("UPDATE component SET model_name = ? WHERE model_name = ?"); + QVariantList params; + params.append(strOld); + params.append(strNew); + try + { + executeSQL(strSQL,false,params); + return true; + } + catch (const std::exception& e) + { + LOG_ERROR("DB", QString("Update component model_name %1 fail").arg(strOld)); + return false; + } +} + bool DataBase::deleteTable(const QString& sName) { QString strSQL = QString("DROP TABLE IF EXISTS %1").arg(sName); @@ -1681,3 +1724,28 @@ bool DataBase::modifyProjectTable(QString sTable,QMap mOld,QMap } return true; } + +QStringList DataBase::ifModelOccupy(const QString& sName) +{ + QStringList lst; + QMap map; + QString strSQL = "SELECT tag FROM component WHERE model_name = ?"; + QVariantList params; + params.append(sName); + + try + { + QSqlQuery query = executeSQL(strSQL,false,params); + while (query.next()) + { + QString str = query.value(0).toString(); + lst.append(str); + } + query.clear(); + return lst; + } + catch (const std::exception& e) + { + return lst; + } +} diff --git a/include/projectModelDlg.h b/include/projectModelDlg.h index b4cd357..d1fd740 100644 --- a/include/projectModelDlg.h +++ b/include/projectModelDlg.h @@ -4,34 +4,52 @@ #include #include #include +#include +#include "tools.h" +#include "global.h" QT_BEGIN_NAMESPACE namespace Ui { class projectModelDlg; } QT_END_NAMESPACE +enum projectState +{ + Err = -1, + NotExist = 0, + Exist, + Changed +}; + +struct FormerName //曾用名,记录修改前名称 +{ + QString sName; + bool bChanged = false; //是否改变过 +}; + struct PropertyState //每个属性的状态 { bool checkState = false; QString dataType; }; -struct PropertyPage //属性列表信息 +struct PropertyPage //属性信息 { - QStandardItemModel* pBase; //基础属性 - QStandardItemModel* pSelect; //已选择属性 QMap mCheckState; //属性选择状态 }; -typedef QMap MapProperty; //str为属性名,model1基础属性,model2已选择属性 +typedef QMap MapProperty; //属性组 struct PropertyModel //工程模 { MapProperty mapProperty; int nType = 0; //工程模类型,选择图标后确定 + QStandardItemModel* pBase; //基础属性 + QStandardItemModel* pSelect; //已选择属性 + FormerName formerMeta; //曾用元模名 + FormerName formerProject; //曾用工程模名 + QMap dataInfo; //存放数据库内容 }; -typedef QMap MapProject; //str为工程名,property为属性集 -typedef QMap MapMeta; //str为元模名,project为工程模集 - -class RenameModel; +typedef QMap MapProject; //str为工程名,PropertyModel为工程属性 +typedef QMap MapMeta; //str为元模名,PropertyModel为工程模集 class projectModelDlg : public QDialog { @@ -44,8 +62,8 @@ public: void initial(); void initialModel(); void initialList(); - MapProperty addNewProject(const QString& sMeta,const QString& sProject); //根据元模型、工程模名称生成工程模对象 - void update(); + MapProperty addNewProject(const QString& sMeta,const QString& sProject,PropertyModel&); //根据元模型、工程模名称生成工程模对象 + //void update(); void generate(const QString&); //根据输入名称生成表 public slots: @@ -53,13 +71,17 @@ public slots: void onCancelClicked(); void onApplyClicked(); void onRevokeClicked(); - void onBaseModelIndexChanged(const QString&); - void onProjectIndexChanged(const QString&); - void onPropertyIndexChanged(const QString&); - void onIconClicked(const QModelIndex &index); //关联图元改变 - void onIndexClicked(const QModelIndex &index); //索引列表点击 + //void onBaseModelIndexChanged(const QString&); + //void onProjectIndexChanged(const QString&); + //void onPropertyIndexChanged(const QString&); + //void onIconClicked(const QModelIndex &index); //关联图元改变 + //void onIndexClicked(const QModelIndex &index); //索引列表点击 void onIndexRbtnClicked(const QPoint &pos); //索引列表右键菜单 void onDeleteProjectClicked(); //删除选中工程模 + + void addPropertyGroup(); //添加tableWidget中的工程模 + void onTableItemClicked(QTableWidgetItem *item); //模型item点击事件 + void onDelegateFinishEdit(const QModelIndex &index, const QString &value); //lineEdit代理编辑完成事件 public: QStringList getModelList() const; //获取元模型列表 QStringList getGroupList(const QString& model) const; //返回该元模下的属性组列表 @@ -70,20 +92,33 @@ public: QString getMetaName() const; //返回当前元模型名 bool ifProjectEqual(QMap); //根据每个属性组的勾选状态判断两个模型是否相同 QString modifyProjectModel(QMap); //修改工程模 + bool renameProjectModel(const QString& strCur,QMap datas); //重命名工程模 + void updateComponentModelName(const QString& strOld,const QString& strNew); //更新component中的工程模 private: - void updateIconList(); //选择工程模后刷新关联图标 - void removeProjectData(const QString&,const QString&); //移除对应的project层级结构 + //void updateIconList(); //选择工程模后刷新关联图标 + void removeProjectData(const QString&,const QString&,int role); //移除对应的project层级结构 QString getItemDataType(const QStandardItem* pItem); //返回数据类型 - bool createPropertyTable(const QString& sProject,MapProperty::Iterator iter,int nLinkType); //创建属性组表并插入记录到管理表(工程名,当前项迭代器,关联图元类型) - QJsonObject getSelectedState(MapProperty::Iterator iter); //返回json格式的选中状态 + bool createPropertyTable(const QString& sProject,const QString& sGroup,QList lstSelect,QList lstBase,int nLinkType); //创建属性组表并插入记录到管理表(工程名,当前项迭代器,关联图元类型) + QJsonObject getSelectedState(QList select,QList base); //返回json格式的选中状态 + QList getGroupSub(QStandardItemModel*,const QString&); //返回指定组下的属性(如果存在) + + void setupUI(); + void initialTypeMap(); + int getLevel(QStandardItem *item); //返回当前item所在层级,0为根 + projectState couldSave(); + + void setTableItemState(int row,TableItemState state); //设置状态 + int getModelEditState(); //返回工程模编辑状态(选择、编辑、新建) private: Ui::projectModelDlg *ui; - RenameModel* m_pRenameModel; - QStandardItemModel* _viewModel; //索引view模型 MapMeta m_mapTotal; QString _curMeta; //当前元模型 QString _curProject; //当前工程模 - QString _curProperty; //当前属性 + QString _curType; //当前关联类型 + PropertyModel _curModel; //新建的model + int _curRow; //当前操作行 + + BiDirectionalMap _mapType; //类型名映射表 }; #endif diff --git a/include/projectTableDelegate.h b/include/projectTableDelegate.h new file mode 100644 index 0000000..3815c9a --- /dev/null +++ b/include/projectTableDelegate.h @@ -0,0 +1,28 @@ +#ifndef PROJECTMODELCOMBODELEGATE_H +#define PROJECTMODELCOMBODELEGATE_H + +#include + +class ProjectTableDelegate : public QStyledItemDelegate +{ + Q_OBJECT +public: + ProjectTableDelegate(QObject *parent = nullptr); + ~ProjectTableDelegate(); + + QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option,const QModelIndex& index) const override; + + //bool eventFilter(QObject* obj, QEvent* event) override; + + //void setEditorData(QWidget* editor, const QModelIndex& index) const override; + + //void setModelData(QWidget* editor, QAbstractItemModel* model,const QModelIndex& index) const override; + + bool editorEvent(QEvent* event, QAbstractItemModel* model, + const QStyleOptionViewItem& option, const QModelIndex& index) override; + void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; +signals: + void editingFinished(const QModelIndex &index, const QString &value) const; +}; + +#endif // PROJECTMODELCOMBODELEGATE_H diff --git a/include/renameModel.h b/include/renameModel.h index 040aadb..accc79c 100644 --- a/include/renameModel.h +++ b/include/renameModel.h @@ -8,13 +8,13 @@ QT_BEGIN_NAMESPACE namespace Ui { class renameModel; } QT_END_NAMESPACE -enum projectState +/*enum projectState { Err = -1, NotExist = 0, Exist, Changed -}; +};*/ class projectModelDlg; @@ -35,7 +35,7 @@ public slots: void onCancelClicked(); private: void setShowName(); //获取当前名称并显示 - projectState couldSave(); //判断当前名称是否可用 + //projectState couldSave(); //判断当前名称是否可用 private: Ui::renameModel *ui; projectModelDlg* _pParent; diff --git a/include/selectorDialog.h b/include/selectorDialog.h new file mode 100644 index 0000000..1742b71 --- /dev/null +++ b/include/selectorDialog.h @@ -0,0 +1,32 @@ +#ifndef SELECTORDIALOG_H +#define SELECTORDIALOG_H + +#include +#include +#include +#include +#include "global.h" + +// 自定义元件选择对话框 +class SelectorDialog : public QDialog { +public: + SelectorDialog(QWidget* parent = nullptr); + + void initial(SelectorDialogType tpe); + QString selectedComponent() const { + return m_selectedComponent; + } +private: + QListView* m_listView; + QString m_selectedComponent; + QDialogButtonBox* m_buttonBox; + SelectorDialogType m_dlgType; + + void setupUI(); + void setupConnections(); + QStandardItemModel * initialModel(); +private: + QStringList getMetaList() const; +}; + +#endif //SELECTORDIALOG_H diff --git a/source/projectModelDlg.cpp b/source/projectModelDlg.cpp index 7430487..3d5ae2b 100644 --- a/source/projectModelDlg.cpp +++ b/source/projectModelDlg.cpp @@ -1,26 +1,25 @@ #include #include #include -#include "projectModelDlg.h" -#include "renameModel.h" -#include "dataBase.h" +#include #include "ui_projectModelDlg.h" +#include "projectModelDlg.h" +#include "dataBase.h" #include "global.h" +#include "ProjectTableDelegate.h" const QSet stringDataTypes = {"varchar", "char", "text", "date", "time", "timestamp"}; projectModelDlg::projectModelDlg(QWidget *parent) : QDialog(parent) , ui(new Ui::projectModelDlg) - ,m_pRenameModel(nullptr) - ,_viewModel(nullptr) + ,_curRow(-1) { ui->setupUi(this); this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); setWindowModality(Qt::WindowModal); - m_pRenameModel = new RenameModel(this); - if(m_pRenameModel) - m_pRenameModel->hide(); + initialTypeMap(); + setupUI(); initial(); } @@ -31,37 +30,38 @@ projectModelDlg::~projectModelDlg() void projectModelDlg::initial() { - ui->stackedWidget->setCurrentIndex(1); connect(ui->btn_save,&QPushButton::clicked,this,&projectModelDlg::onSaveClicked); connect(ui->btn_cancel,&QPushButton::clicked,this,&projectModelDlg::onCancelClicked); connect(ui->btn_apply,&QPushButton::clicked,this,&projectModelDlg::onApplyClicked); connect(ui->btn_revoke,&QPushButton::clicked,this,&projectModelDlg::onRevokeClicked); - connect(ui->cb_baseModel,&QComboBox::textActivated,this,&projectModelDlg::onBaseModelIndexChanged); - connect(ui->cb_projectModel,&QComboBox::textActivated,this,&projectModelDlg::onProjectIndexChanged); - connect(ui->cb_property,&QComboBox::textActivated,this,&projectModelDlg::onPropertyIndexChanged); + //connect(ui->cb_baseModel,&QComboBox::textActivated,this,&projectModelDlg::onBaseModelIndexChanged); + //connect(ui->cb_projectModel,&QComboBox::textActivated,this,&projectModelDlg::onProjectIndexChanged); + //connect(ui->cb_property,&QComboBox::textActivated,this,&projectModelDlg::onPropertyIndexChanged); - ui->treeView_model->setContextMenuPolicy(Qt::CustomContextMenu); - connect(ui->treeView_model, &QTreeView::customContextMenuRequested, this, &projectModelDlg::onIndexRbtnClicked); - connect(ui->treeView_model, &QTreeView::clicked, this, &projectModelDlg::onIndexClicked); + //ui->treeView_model->setContextMenuPolicy(Qt::CustomContextMenu); + connect(ui->tableWidget_model, &QTableWidget::customContextMenuRequested, this, &projectModelDlg::onIndexRbtnClicked); + //connect(ui->treeView_model, &QTreeView::clicked, this, &projectModelDlg::onIndexClicked); + + connect(ui->btn_new, &QPushButton::clicked, this, &projectModelDlg::addPropertyGroup); + connect(ui->tableWidget_model, &QTableWidget::itemClicked, this, &projectModelDlg::onTableItemClicked); initialModel(); initialList(); update(); } -MapProperty projectModelDlg::addNewProject(const QString& sMeta,const QString& sProject) +MapProperty projectModelDlg::addNewProject(const QString& sMeta,const QString& sProject,PropertyModel& model) { MapProperty mt; - QStringList lstProperty = getGroupList(sMeta); + QStringList lstProperty = getGroupList(sMeta); //返回元模下的属性组名 //lstProperty< mapCheckState = DataBase::GetInstance()->getCheckStateFromManager(sProject); //获取选择状态 for(auto &property:lstProperty) { PropertyPage struProperty; - struProperty.pBase = new QStandardItemModel(this); - struProperty.pSelect = new QStandardItemModel(this); - if(mapCheckState.contains(property)) //生成的模型中勾选了该属性组 + + if(mapCheckState.contains(property) && !model.formerMeta.bChanged) //生成的模型中勾选了该属性组且元模未改变过 { QJsonObject obj = mapCheckState[property]; QJsonArray nodesJsonArray = obj["checkState"].toArray(); @@ -80,26 +80,56 @@ MapProperty projectModelDlg::addNewProject(const QString& sMeta,const QString& s sta.dataType = dataType; if(nState) { - struProperty.pSelect->appendRow(pItem); - sta.checkState = true; - struProperty.mCheckState.insert(propertyName,sta); + QStandardItem* pGroup = nullptr; + if(model.pSelect->findItems(propertyName).isEmpty()) + { + pGroup = new QStandardItem(property); + model.pSelect->appendRow(pGroup); //属性的组未存在,将组添加到model + } + else + { + pGroup = model.pSelect->findItems(propertyName)[0]; + } + + if(pGroup){ + pGroup->appendRow(pItem); + sta.checkState = true; + struProperty.mCheckState.insert(propertyName,sta); + } } else { - struProperty.pBase->appendRow(pItem); - sta.checkState = false; - struProperty.mCheckState.insert(propertyName,sta); + QStandardItem* pGroup = nullptr; + if(model.pBase->findItems(propertyName).isEmpty()) + { + pGroup = new QStandardItem(property); + model.pBase->appendRow(pGroup); //属性的组未存在,将组添加到model + } + else + { + pGroup = model.pBase->findItems(propertyName)[0]; + } + + if(pGroup){ + pGroup->appendRow(pItem); + sta.checkState = false; + struProperty.mCheckState.insert(propertyName,sta); + } } } } - else //未勾选属性组或是新建 + else //未勾选属性组或是新建或元模已改变 { + QStandardItem* pGroup = nullptr; //新建的不包含属性组 + pGroup = new QStandardItem(property); + model.pBase->appendRow(pGroup); + QStringList lstName = getAttributeList(sMeta,property); for(auto &name:lstName) { QStandardItem* pItem = new QStandardItem(name); setItemAttribute(name,pItem); - struProperty.pBase->appendRow(pItem); + pGroup->appendRow(pItem); QString dataType = getItemDataType(pItem); PropertyState sta; sta.dataType = dataType; @@ -115,60 +145,72 @@ MapProperty projectModelDlg::addNewProject(const QString& sMeta,const QString& s void projectModelDlg::initialModel() { - _viewModel = new QStandardItemModel(this); QStringList lstModel = getModelList(); - //lstType< mapProject = DataBase::GetInstance()->getProjectFromManager(model); - mapProject.insert(QString::fromWCharArray(L"新建"),0); //每个类别都有未命名工程 - QStandardItem* modelItem = new QStandardItem(model); //总览view类型 + QMap::Iterator iter; for(iter = mapProject.begin();iter != mapProject.end(); ++iter) { QStandardItem* propertyItem = new QStandardItem(iter.key()); - modelItem->appendRow(propertyItem); //总览view名称 PropertyModel pm; - pm.mapProperty = addNewProject(model,iter.key()); + pm.pBase = new QStandardItemModel(this); + pm.pSelect = new QStandardItemModel(this); + pm.mapProperty = addNewProject(model,iter.key(),pm); pm.nType = iter.value(); + pm.formerMeta.sName = model; + pm.formerProject.sName = iter.key(); + pm.dataInfo = DataBase::GetInstance()->getProjectModelGroupInfo(iter.key()); mp.insert(iter.key(),pm); } - _viewModel->appendRow(modelItem); //todo:读取存储,按分类遍历名称 m_mapTotal.insert(model,mp); } - ui->treeView_model->setModel(_viewModel); } void projectModelDlg::initialList() { - QStandardItemModel *model = new QStandardItemModel(this); - ui->listView_icon->setModel(model); + MapMeta::Iterator iter; + for(iter = m_mapTotal.begin();iter != m_mapTotal.end();++iter) + { + MapProject proj = iter.value(); + MapProject::Iterator it; + for(it = proj.begin();it != proj.end();++it) + { + int row = ui->tableWidget_model->rowCount(); + ui->tableWidget_model->insertRow(row); - QStandardItem* pNon = new QStandardItem(QString::fromWCharArray(L"未选择")); - QStandardItem* pMotor = new QStandardItem("motor"); - QStandardItem* pBus = new QStandardItem("bus"); - pNon->setData(0,Qt::UserRole); - pMotor->setData(1,Qt::UserRole); - pBus->setData(2,Qt::UserRole); - model->appendRow(pNon); - model->appendRow(pMotor); - model->appendRow(pBus); + // 工程模列(可编辑) + QTableWidgetItem* projectItem = new QTableWidgetItem(it.key()); + //projectItem->setFlags(projectItem->flags() | Qt::ItemIsEditable); + ui->tableWidget_model->setItem(row, 0, projectItem); + projectItem->setData(Qt::UserRole,TS_select); + + // 元模型列(初始化值) + QTableWidgetItem* metaItem = new QTableWidgetItem(iter.key()); + ui->tableWidget_model->setItem(row, 1, metaItem); + + // 元件类型列(初始提示) + QString strType = _mapType.key(it->nType); + QTableWidgetItem* typeItem = new QTableWidgetItem(strType); + ui->tableWidget_model->setItem(row, 2, typeItem); + } + } - connect(ui->listView_icon,&QListView::clicked,this,&projectModelDlg::onIconClicked); } -void projectModelDlg::update() +/*void projectModelDlg::update() { for(MapMeta::Iterator iter = m_mapTotal.begin();iter != m_mapTotal.end();++iter) { ui->cb_baseModel->addItem(iter.key()); } -} +}*/ void projectModelDlg::generate(const QString& str) { @@ -184,32 +226,26 @@ void projectModelDlg::generate(const QString& str) bool createRes = true; //动态表生成结果 for(MapProperty::Iterator it = mapProperty.begin();it != mapProperty.end();++it){ //每个属性组单独生成表 int nType = ite.value().nType; - QStandardItemModel* pSelectModel = it->pSelect; - QStandardItem *rootItem = pSelectModel->invisibleRootItem(); + QStandardItemModel* pSelectModel = ite->pSelect; + QStandardItemModel* pBaseModel = ite->pBase; + /*QStandardItem *rootItem = pSelectModel->invisibleRootItem(); if(rootItem->rowCount() == 0) //修改逻辑,未勾选的属性组不生成表 by/20250311 - continue; - bool res = createPropertyTable(str,it,nType); - createRes = createRes && res; + continue;*/ + QList lstSelected = getGroupSub(pSelectModel,it.key()); + QList lstBase = getGroupSub(pBaseModel,it.key()); + if(!lstSelected.isEmpty()) + { + bool res = createPropertyTable(str,it.key(),lstSelected,lstBase,nType); + createRes = createRes && res; + } } if(createRes) { - PropertyModel pm = m_mapTotal[_curMeta].take(_curProject); //取出要保存的对象,另存为新索引 + /*PropertyModel pm = m_mapTotal[_curMeta].take(_curProject); //取出要保存的对象,另存为新索引 m_mapTotal[_curMeta].insert(str,pm); - if(_curProject == QString::fromWCharArray(L"新建")) - { - ui->cb_projectModel->addItem(str); - PropertyModel npm; //新建工程对象 - npm.mapProperty = addNewProject(_curMeta,_curProject); - m_mapTotal[_curMeta].insert(_curProject,npm); - QList lst = _viewModel->findItems(_curMeta); - if(lst.size() == 1) - { - QStandardItem* item = lst[0]; - item->appendRow(new QStandardItem(str)); - } - } - _curProject = str; + _curProject = str;*/ + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"创建表成功")); } else //创建失败 @@ -225,7 +261,7 @@ void projectModelDlg::onSaveClicked() { if(_curProject.isEmpty()) { - QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"请选择操作的工程对象")); + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"请选择操作的模型")); } else { @@ -234,9 +270,172 @@ void projectModelDlg::onSaveClicked() QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"请选择工程模类型")); return; } - if(m_pRenameModel) + projectState state = couldSave(); + if(state == NotExist) //目前名称工程模不存在 { - m_pRenameModel->showCenter(); + PropertyModel proModel = m_mapTotal[_curMeta][_curProject]; + if(proModel.formerProject.bChanged) //工程模改过名 + { + if(proModel.formerMeta.bChanged) //元模改过类型 + { + QStringList lst = DataBase::GetInstance()->ifModelOccupy(proModel.formerProject.sName); + if(!lst.isEmpty()){ //工程模被占用 + QMessageBox msgBox; + msgBox.setText(QString::fromWCharArray(L"工程模将被修改")); + QString info = QString::fromWCharArray(L"该工程模已被元件%1使用,是否继续修改?"); //todo:修改工程模后相关处理 + msgBox.setInformativeText(info); + msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Cancel); + int ret = msgBox.exec(); + switch (ret) { + case QMessageBox::Yes: + { + bool val = DataBase::GetInstance()->deleteProjectModel(proModel.formerProject.sName); //删除旧工程模,生成新工程模 + if(val) + { + generate(_curProject); + setTableItemState(_curRow,TS_select); + } + break; + } + case QMessageBox::Cancel: + // Cancel was clicked + break; + default: + // should never be reached + break; + } + } + else{ //工程模未被使用 + bool val = DataBase::GetInstance()->deleteProjectModel(proModel.formerProject.sName); //删除旧工程模,生成新工程模 + if(val) + { + generate(_curProject); + setTableItemState(_curRow,TS_select); + } + } + } + else //元模未改类型 + { + QMap map = DataBase::GetInstance()->getCheckStateFromManager(proModel.formerProject.sName); + bool val = ifProjectEqual(map); + + QStringList lst = DataBase::GetInstance()->ifModelOccupy(proModel.formerProject.sName); + if(!lst.isEmpty()){ //工程模被使用 + QMessageBox msgBox; + msgBox.setText(QString::fromWCharArray(L"工程模将被修改")); + QString info = QString::fromWCharArray(L"该工程模已被元件%1使用,是否继续修改?"); //todo:修改工程模后相关处理 + msgBox.setInformativeText(info); + msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Cancel); + int ret = msgBox.exec(); + switch (ret) { + case QMessageBox::Yes: + { + if(val) //旧工程模和新工程模数据相同,改名 + { + renameProjectModel(_curProject,proModel.dataInfo); + updateComponentModelName(proModel.formerProject.sName,_curProject); //修改component中的模型名 + setTableItemState(_curRow,TS_select); + } + else //不同,先改工程模名称,后修改数据 + { + renameProjectModel(_curProject,proModel.dataInfo); + updateComponentModelName(proModel.formerProject.sName,_curProject); //修改component中的模型名 + QString sRes = modifyProjectModel(map); + if(!sRes.isEmpty()) + { + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改模型成功")); + setTableItemState(_curRow,TS_select); + } + else + { + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改模型失败")); + } + } + break; + } + case QMessageBox::Cancel: + // Cancel was clicked + break; + default: + // should never be reached + break; + } + } + else //工程模未被使用 + { + if(val) //旧工程模和新工程模数据相同,改名 + { + renameProjectModel(_curProject,proModel.dataInfo); + setTableItemState(_curRow,TS_select); + } + else //不同,先改工程模名称,后修改数据 + { + renameProjectModel(_curProject,proModel.dataInfo); + QString sRes = modifyProjectModel(map); + if(!sRes.isEmpty()) + { + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改模型成功")); + setTableItemState(_curRow,TS_select); + } + else + { + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改模型失败")); + } + } + } + } + } + else //新建 + { + generate(_curProject); + setTableItemState(_curRow,TS_select); + } + } + else if(state == Exist) + { + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"该模型已经存在")); + } + else if(state == Changed) + { + QMessageBox msgBox; + msgBox.setText(QString::fromWCharArray(L"提示")); + msgBox.setInformativeText(QString::fromWCharArray(L"该模型已存在且与同名模型不一致,是否替换库模型?")); + msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Cancel); + int ret = msgBox.exec(); + if(ret == QMessageBox::Yes) + { + PropertyModel proModel = m_mapTotal[_curMeta][_curProject]; + if(proModel.formerMeta.bChanged) //判断元模是否改变,元模变了删除旧工程模,添加新工程模 + { + bool val = DataBase::GetInstance()->deleteProjectModel(proModel.formerProject.sName); + if(val) + { + generate(_curProject); + setTableItemState(_curRow,TS_select); + } + } + else //元模未变直接修改 + { + QMap mapCheckState = DataBase::GetInstance()->getCheckStateFromManager(_curProject); //获取选择状态 + QString sRes = modifyProjectModel(mapCheckState); + if(!sRes.isEmpty()) + { + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改模型成功")); + setTableItemState(_curRow,TS_select); + } + else + { + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改模型失败")); + } + } + } + else if(ret == QMessageBox::Cancel) + { + + } } } } @@ -249,63 +448,106 @@ void projectModelDlg::onCancelClicked() void projectModelDlg::onApplyClicked() { - if(_curProperty.isEmpty()) + MapMeta::Iterator iter = m_mapTotal.find(_curMeta); + if(iter != m_mapTotal.end()) { - QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"请先选择属性")); - } - else - { - MapMeta::Iterator iter = m_mapTotal.find(_curMeta); - if(iter != m_mapTotal.end()) + MapProject project = iter.value(); + MapProject::Iterator it= project.find(_curProject); + if(it != project.end()) { - MapProject project = iter.value(); - MapProject::Iterator it= project.find(_curProject); - if(it != project.end()) + MapProperty property = it.value().mapProperty; + QModelIndex selected = ui->treeView_base->currentIndex(); + QStandardItem* pItem = it->pBase->itemFromIndex(selected); + + if(pItem) { - MapProperty property = it.value().mapProperty; - QModelIndex selected = ui->treeView_base->currentIndex(); - QStandardItem* item = property[_curProperty].pBase->takeItem(selected.row()); - if(item) - { - property[_curProperty].pSelect->appendRow(item); - property[_curProperty].pBase->removeRow(selected.row()); - m_mapTotal[_curMeta][_curProject].mapProperty[_curProperty].mCheckState[item->text()].checkState = true; //选择状态设为1 + int nLevel = getLevel(pItem); + if(nLevel != 1) //不是二级节点就返回 + return; + else{ + QString strGroup = pItem->parent()->text(); + //QStandardItem* item = it->pBase->takeItem(selected.row()); + QStandardItem *parentItem = pItem->parent(); + if (parentItem) { + parentItem->takeRow(pItem->row()); + } + + QList groupItem = it->pSelect->findItems(strGroup); + if(groupItem.isEmpty()) //已选对象中是否存在该组,没有则添加 + { + QStandardItem* pGroup = new QStandardItem(strGroup); + it->pSelect->appendRow(pGroup); + pGroup->appendRow(pItem); + } + else{ + QStandardItem* pGroup = groupItem[0]; + pGroup->appendRow(pItem); + } + + //it->pBase->removeRow(selected.row()); + + m_mapTotal[_curMeta][_curProject].mapProperty[strGroup].mCheckState[pItem->text()].checkState = true; //选择状态设为1 } } } } + + ui->treeView_sub->expandAll(); } void projectModelDlg::onRevokeClicked() { - if(_curProperty.isEmpty()) + MapMeta::Iterator iter = m_mapTotal.find(_curMeta); + if(iter != m_mapTotal.end()) { - QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"请先选择属性")); - } - else - { - MapMeta::Iterator iter = m_mapTotal.find(_curMeta); - if(iter != m_mapTotal.end()) + MapProject project = iter.value(); + MapProject::Iterator it= project.find(_curProject); + if(it != project.end()) { - MapProject project = iter.value(); - MapProject::Iterator it= project.find(_curProject); - if(it != project.end()) + MapProperty property = it.value().mapProperty; + QModelIndex selected = ui->treeView_sub->currentIndex(); + QStandardItem* pItem = it->pSelect->itemFromIndex(selected); + + if(pItem) { - MapProperty property = it.value().mapProperty; - QModelIndex selected = ui->treeView_sub->currentIndex(); - QStandardItem* item = property[_curProperty].pSelect->takeItem(selected.row()); - if(item) - { - property[_curProperty].pBase->appendRow(item); - property[_curProperty].pSelect->removeRow(selected.row()); - m_mapTotal[_curMeta][_curProject].mapProperty[_curProperty].mCheckState[item->text()].checkState = false; //选择状态设为0 + int nLevel = getLevel(pItem); + if(nLevel != 1) //不是二级节点就返回 + return; + else{ + QString strGroup = pItem->parent()->text(); + //QStandardItem* item = it->pBase->takeItem(selected.row()); + QStandardItem *parentItem = pItem->parent(); + if (parentItem) { + parentItem->takeRow(pItem->row()); + if(!parentItem->hasChildren()){ + it->pSelect->takeRow(parentItem->row()); + } + } + + QList groupItem = it->pBase->findItems(strGroup); + if(groupItem.isEmpty()) //已选对象中是否存在该组,没有则添加 + { + QStandardItem* pGroup = new QStandardItem(strGroup); + it->pBase->appendRow(pGroup); + pGroup->appendRow(pItem); + } + else{ + QStandardItem* pGroup = groupItem[0]; + pGroup->appendRow(pItem); + } + + //it->pSelect->removeRow(selected.row()); + + m_mapTotal[_curMeta][_curProject].mapProperty[strGroup].mCheckState[pItem->text()].checkState = false; //选择状态设为1 } } } } + + ui->treeView_base->expandAll(); } -void projectModelDlg::onBaseModelIndexChanged(const QString& str) +/*void projectModelDlg::onBaseModelIndexChanged(const QString& str) { if(_curMeta == str) //选择未改变 { @@ -332,9 +574,9 @@ void projectModelDlg::onBaseModelIndexChanged(const QString& str) ui->cb_projectModel->addItem(it.key()); } } -} +}*/ -void projectModelDlg::onProjectIndexChanged(const QString& str) +/*void projectModelDlg::onProjectIndexChanged(const QString& str) { if(_curMeta.isEmpty()) { @@ -370,9 +612,9 @@ void projectModelDlg::onProjectIndexChanged(const QString& str) } updateIconList(); } -} +}*/ -void projectModelDlg::onPropertyIndexChanged(const QString& str) +/*void projectModelDlg::onPropertyIndexChanged(const QString& str) { if(_curProject.isEmpty()) { @@ -408,9 +650,9 @@ void projectModelDlg::onPropertyIndexChanged(const QString& str) } } } -} +}*/ -void projectModelDlg::onIconClicked(const QModelIndex &index) +/*void projectModelDlg::onIconClicked(const QModelIndex &index) { QStandardItemModel *model = dynamic_cast(ui->listView_icon->model()); if(model) @@ -419,9 +661,9 @@ void projectModelDlg::onIconClicked(const QModelIndex &index) int id = pItem->data(Qt::UserRole).toInt(); m_mapTotal[_curMeta][_curProject].nType = id; } -} +}*/ -void projectModelDlg::onIndexClicked(const QModelIndex &index) +/*void projectModelDlg::onIndexClicked(const QModelIndex &index) { // 获取模型 QStandardItemModel *model = qobject_cast(ui->treeView_model->model()); @@ -449,37 +691,32 @@ void projectModelDlg::onIndexClicked(const QModelIndex &index) _curMeta = sMeta; _curProject = ""; } -} +}*/ void projectModelDlg::onIndexRbtnClicked(const QPoint &pos) { // 获取当前点击的位置对应的索引 - QModelIndex index = ui->treeView_model->indexAt(pos); + QModelIndex index = ui->tableWidget_model->indexAt(pos); if (!index.isValid()) { return; // 如果点击的是空白区域,直接返回 } - // 判断是否为第一级节点 - if (!index.parent().isValid()) { - return; // 如果是第一级节点,不显示菜单 - } - // 如果是第二级节点,创建右键菜单 QMenu menu; - QAction *deleteAction = new QAction("删除节点", this); + QAction *deleteAction = new QAction("删除模型", this); menu.addAction(deleteAction); // 连接删除菜单项的触发信号与槽函数 connect(deleteAction, &QAction::triggered, this, &projectModelDlg::onDeleteProjectClicked); // 在点击位置显示菜单 - menu.exec(ui->treeView_model->mapToGlobal(pos)); + menu.exec(ui->tableWidget_model->mapToGlobal(pos)); } void projectModelDlg::onDeleteProjectClicked() { // 获取当前选中的索引 - QModelIndexList selectedIndexes = ui->treeView_model->selectionModel()->selectedRows(); + QModelIndexList selectedIndexes = ui->tableWidget_model->selectionModel()->selectedRows(); if (selectedIndexes.isEmpty()) { return; // 没有选中任何行 } @@ -492,46 +729,346 @@ void projectModelDlg::onDeleteProjectClicked() return; } - // 获取模型 - QStandardItemModel *model = qobject_cast(ui->treeView_model->model()); - if (!model) { + int currentRow = ui->tableWidget_model->currentRow(); + if (currentRow == -1) { + return; // 没有选中行 + } + QString strProj = ui->tableWidget_model->item(currentRow, 0)->text(); + QString strMeta = ui->tableWidget_model->item(currentRow, 1)->text(); + + _curProject = strProj; + _curMeta = strMeta; + + // 删除当前选中的项 + + QStringList lst = DataBase::GetInstance()->ifModelOccupy(_curProject); + QString info = QString::fromWCharArray(L"删除后不可恢复,是否删除?"); + if(!lst.empty()) //非空,被占用 + { + info = QString::fromWCharArray(L"工程模被%1元件使用中,是否继续删除?").arg(lst.join(",")); + } + QMessageBox msgBox; + msgBox.setText(QString::fromWCharArray(L"工程模将被删除")); + msgBox.setInformativeText(info); + msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Cancel); + int ret = msgBox.exec(); + switch (ret) { + case QMessageBox::Yes: + { + int role = index.data(Qt::UserRole).toInt(); + if(role != TS_create) //create状态的数据未创建数据库 + { + bool val = DataBase::GetInstance()->deleteProjectModel(_curProject); + } + + removeProjectData(_curMeta,_curProject,role); + + ui->tableWidget_model->removeRow(currentRow); + _curMeta = ""; + _curProject = ""; + //QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"删除失败")); + break; + } + case QMessageBox::Cancel: + // Cancel was clicked + break; + default: + // should never be reached + break; + } +} + +void projectModelDlg::addPropertyGroup() +{ + int state = getModelEditState(); + if(state & TS_create) + { + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"请先完成编辑")); return; } + int row = ui->tableWidget_model->rowCount(); + ui->tableWidget_model->insertRow(row); - // 判断是否为第二级节点 - if (index.parent().isValid()) { // 父索引有效,说明是第二级节点 - // 删除当前选中的项 - QString meta = model->data(index.parent(), Qt::DisplayRole).toString(); - QString text = model->data(index, Qt::DisplayRole).toString(); - QMessageBox msgBox; - msgBox.setText(QString::fromWCharArray(L"工程模将被删除")); - msgBox.setInformativeText(QString::fromWCharArray(L"删除后不可恢复,确定删除?")); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); - msgBox.setDefaultButton(QMessageBox::Cancel); - int ret = msgBox.exec(); - switch (ret) { - case QMessageBox::Yes: + // 工程模列(可编辑) + QTableWidgetItem* projectItem = new QTableWidgetItem("未命名"); + //projectItem->setFlags(projectItem->flags() | Qt::ItemIsEditable); + ui->tableWidget_model->setItem(row, 0, projectItem); + projectItem->setData(Qt::UserRole,TS_create); + + // 元模型列(初始化值) + QTableWidgetItem* metaItem = new QTableWidgetItem("未关联"); + ui->tableWidget_model->setItem(row, 1, metaItem); + + // 元件类型列(初始提示) + QTableWidgetItem* typeItem = new QTableWidgetItem("未选择"); + ui->tableWidget_model->setItem(row, 2, typeItem); + + ui->tableWidget_model->selectRow(row); + + PropertyModel pm; + pm.pBase = new QStandardItemModel(this); + pm.pSelect = new QStandardItemModel(this); + _curModel = pm; +} + +void projectModelDlg::onTableItemClicked(QTableWidgetItem *item) +{ + // 获取选中行的索引 + int row = item->row(); + _curRow = row; + QString strProj = ui->tableWidget_model->item(row, 0)->text(); + QString strMeta = ui->tableWidget_model->item(row, 1)->text(); + + QTableWidgetItem *firstColumnItem = ui->tableWidget_model->item(row,0); + if(firstColumnItem) + { + TableItemState state = TableItemState(firstColumnItem->data(Qt::UserRole).toInt()); + if(state == TS_create) { - bool val = DataBase::GetInstance()->deleteProjectModel(text); - if(val) + int col = item->column(); + if(col == TD_ProjectModel) //工程模输入框,不做特殊处理 { - removeProjectData(meta,text); - model->removeRow(index.row(), index.parent()); + if(strProj != "未命名") + { + _curProject = strProj; + } + if(strMeta != "未选择") + { + _curMeta = strMeta; + } + return; + } + else if(col == TD_MetaModel) //元模选择 + { + if(strProj == "未命名") + { + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"工程模未命名")); + return; + } + else + { + _curProject = strProj; + } + if(strMeta != "未选择") + { + _curMeta = strMeta; + } + } + else if(col == TD_ComponentType) //类型选择 + { + if(strMeta == "未选择") + { + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"元模未选择")); + return; + } } - else - QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"删除失败")); - break; } - case QMessageBox::Cancel: - // Cancel was clicked - break; - default: - // should never be reached - break; + else if(state == TS_select) + { + /*if(_curProject == strProj) //点击当前的返回 + { + return; + }*/ + ui->treeView_base->setModel(nullptr); + ui->treeView_sub->setModel(nullptr); + + MapMeta::Iterator it; + for(it = m_mapTotal.begin();it != m_mapTotal.end();++it) + { + MapProject proj = it.value(); + MapProject::Iterator iter; + for(iter = proj.begin();iter != proj.end();++iter) + { + if(iter.key() == strProj) + { + ui->treeView_base->setModel(iter->pBase); + ui->treeView_sub->setModel(iter->pSelect); + ui->treeView_base->expandAll(); + ui->treeView_sub->expandAll(); + _curMeta = it.key(); + _curProject = strProj; + return; + } + } + } + } + else if(state == TS_edit) + { + /*if(_curProject == strProj) //点击当前的返回 + { + return; + }*/ + ui->treeView_base->setModel(nullptr); + ui->treeView_sub->setModel(nullptr); + + MapMeta::Iterator it; + for(it = m_mapTotal.begin();it != m_mapTotal.end();++it) + { + MapProject proj = it.value(); + MapProject::Iterator iter; + for(iter = proj.begin();iter != proj.end();++iter) + { + if(iter.key() == strProj) + { + ui->treeView_base->setModel(iter->pBase); + ui->treeView_sub->setModel(iter->pSelect); + ui->treeView_base->expandAll(); + ui->treeView_sub->expandAll(); + _curMeta = it.key(); + _curProject = strProj; + return; + } + } + } + } + } +} + +void projectModelDlg::onDelegateFinishEdit(const QModelIndex &index, const QString &value) +{ + int row = index.row(); + QTableWidgetItem *firstColumnItem = ui->tableWidget_model->item(row, 0); + if(firstColumnItem) + { + TableItemState state = TableItemState(firstColumnItem->data(Qt::UserRole).toInt()); + if(state == TS_create) + { + int col = index.column(); + if(col == TD_ProjectModel) + { + if(m_mapTotal.contains(_curMeta)) //判断元模存在 + { + if(m_mapTotal[_curMeta].contains(_curProject)) //已经存在 + { + if(_curProject == value) //工程模名称未变 + return; + else{ //工程模名称变化,更新存储 + PropertyModel proModel = m_mapTotal[_curMeta].take(_curProject); + m_mapTotal[_curMeta].insert(value,proModel); + _curProject = value; + } + } + else{ //新建 + _curProject = value; + } + } + else + { + _curProject = value; + } + } + else if(col == TD_MetaModel) + { + if(m_mapTotal.contains(_curMeta)) //判断元模存在 + { + if(m_mapTotal[_curMeta].contains(_curProject)) //工程模已经存在 + { + if(_curMeta == value) //选择相同元模 + return; + else{ //元模变化,删除旧model + PropertyModel proModel = m_mapTotal[_curMeta].take(_curProject); //从结构中取出 + ui->treeView_base->setModel(nullptr); + ui->treeView_sub->setModel(nullptr); + delete proModel.pBase; //置空旧model + delete proModel.pSelect; + proModel.pBase = new QStandardItemModel(this); + proModel.pSelect = new QStandardItemModel(this); + proModel.mapProperty = addNewProject(value,_curProject,proModel); //挂接新元模数据 + m_mapTotal[value].insert(_curProject,proModel); //插入到新位置 + ui->treeView_base->setModel(proModel.pBase); + ui->treeView_sub->setModel(proModel.pSelect); + ui->treeView_base->expandAll(); + ui->treeView_sub->expandAll(); + _curMeta = value; + } + } + else //新建 + { + _curModel.mapProperty = addNewProject(value,_curProject,_curModel); + m_mapTotal[value].insert(_curProject,_curModel); + + ui->treeView_base->setModel(nullptr); + ui->treeView_sub->setModel(nullptr); + ui->treeView_base->setModel(_curModel.pBase); + ui->treeView_sub->setModel(_curModel.pSelect); + ui->treeView_base->expandAll(); + ui->treeView_sub->expandAll(); + _curMeta = value; + } + } + else + { + _curModel.mapProperty = addNewProject(value,_curProject,_curModel); + m_mapTotal[value].insert(_curProject,_curModel); + + ui->treeView_base->setModel(nullptr); + ui->treeView_sub->setModel(nullptr); + ui->treeView_base->setModel(_curModel.pBase); + ui->treeView_sub->setModel(_curModel.pSelect); + ui->treeView_base->expandAll(); + ui->treeView_sub->expandAll(); + _curMeta = value; + } + } + else if(col == TD_ComponentType) + { + m_mapTotal[_curMeta][_curProject].nType = _mapType.value(value); + firstColumnItem->setData(Qt::UserRole,TS_edit); + } + } + else if(state == TS_select || state == TS_edit) + { + int col = index.column(); + if(col == TD_ProjectModel) + { + if(m_mapTotal[_curMeta].contains(_curProject)) //已经存在 + { + if(_curProject == value) //工程模名称未变 + return; + else{ //工程模名称变化,更新存储 + PropertyModel proModel = m_mapTotal[_curMeta].take(_curProject); + if(!proModel.formerProject.sName.isEmpty()) //曾用工程模名不为空 + proModel.formerProject.bChanged = true; + m_mapTotal[_curMeta].insert(value,proModel); + _curProject = value; + firstColumnItem->setData(Qt::UserRole,TS_edit); + } + } + } + else if(col == TD_MetaModel) + { + if(m_mapTotal[_curMeta].contains(_curProject)) //已经存在 + { + if(_curMeta == value) //选择相同元模 + return; + else{ //元模变化,删除旧model + PropertyModel proModel = m_mapTotal[_curMeta].take(_curProject); //从结构中取出 + if(!proModel.formerMeta.sName.isEmpty()) //曾用元模名不为空 + proModel.formerMeta.bChanged = true; + ui->treeView_base->setModel(nullptr); + ui->treeView_sub->setModel(nullptr); + delete proModel.pBase; //置空旧model + delete proModel.pSelect; + proModel.pBase = new QStandardItemModel(this); + proModel.pSelect = new QStandardItemModel(this); + proModel.mapProperty = addNewProject(value,_curProject,proModel); //挂接新元模数据 + m_mapTotal[value].insert(_curProject,proModel); //插入到新位置 + ui->treeView_base->setModel(proModel.pBase); + ui->treeView_sub->setModel(proModel.pSelect); + ui->treeView_base->expandAll(); + ui->treeView_sub->expandAll(); + _curMeta = value; + firstColumnItem->setData(Qt::UserRole,TS_edit); + } + } + } + else if(col == TD_ComponentType) + { + m_mapTotal[_curMeta][_curProject].nType = _mapType.value(value); + firstColumnItem->setData(Qt::UserRole,TS_edit); + } } - } else { - // 如果是第一级节点,不执行删除操作 - return; } } @@ -749,6 +1286,8 @@ QString projectModelDlg::modifyProjectModel(QMap mapOld) { QString sRes; MapProperty curPro = m_mapTotal[_curMeta][_curProject].mapProperty; + QStandardItemModel* pSelectModel = m_mapTotal[_curMeta][_curProject].pSelect; + QStandardItemModel* pBaseModel = m_mapTotal[_curMeta][_curProject].pBase; int nType = m_mapTotal[_curMeta][_curProject].nType; QMap::Iterator iter; @@ -774,6 +1313,8 @@ QString projectModelDlg::modifyProjectModel(QMap mapOld) } } else{ + QList lstSelected = getGroupSub(pSelectModel,iter.key()); + QList lstBase = getGroupSub(pBaseModel,iter.key()); if(mapOld.contains(iter.key())){ //新旧模型中都存在,修改模型 QMap oldSchema; //库中模型 属性名/数据类型 QMap newSchema; //现有模型 @@ -805,7 +1346,8 @@ QString projectModelDlg::modifyProjectModel(QMap mapOld) QMap map = DataBase::GetInstance()->getProjectTableName(_curProject); bool res = DataBase::GetInstance()->modifyProjectTable(map[iter.key()],oldSchema,newSchema); - QJsonObject objState = getSelectedState(iter); + + QJsonObject objState = getSelectedState(lstSelected,lstBase); DataBase::GetInstance()->updateCheckState(map[iter.key()],objState); if(res) { @@ -813,7 +1355,7 @@ QString projectModelDlg::modifyProjectModel(QMap mapOld) } } else{ //非空且库模型中不存在,新增 - bool res = createPropertyTable(_curProject,iter,nType); + bool res = createPropertyTable(_curProject,iter.key(),lstSelected,lstBase,nType); if(res) { sRes = QString::fromWCharArray(L"修改模型成功"); @@ -824,7 +1366,22 @@ QString projectModelDlg::modifyProjectModel(QMap mapOld) return sRes; } -void projectModelDlg::updateIconList() +bool projectModelDlg::renameProjectModel(const QString& strCur,QMap datas) +{ + for(auto &data:datas) + { + QString sTable = data.metaModel + QString("_") + strCur + QString("_")+data.groupName; + + DataBase::GetInstance()->updateProjectName(sTable,strCur,data.name); + DataBase::GetInstance()->alterTableName(data.name,sTable); + } +} + +void projectModelDlg::updateComponentModelName(const QString& strOld,const QString& strNew) +{ + DataBase::GetInstance()->updateComponentModelName(strOld,strNew); +} +/*void projectModelDlg::updateIconList() { if(ui->stackedWidget->currentIndex() !=0) { @@ -848,11 +1405,19 @@ void projectModelDlg::updateIconList() } } } -} +}*/ -void projectModelDlg::removeProjectData(const QString& sMeta,const QString& sProject) +void projectModelDlg::removeProjectData(const QString& sMeta,const QString& sProject,int role) { - m_mapTotal[sMeta].remove(sProject); + if(role == TS_create && !m_mapTotal.contains(sMeta)){ //创建且未加入到管理 + delete _curModel.pBase; + delete _curModel.pSelect; + } + else{ + delete m_mapTotal[sMeta][sProject].pBase; //手动释放 + delete m_mapTotal[sMeta][sProject].pSelect; + m_mapTotal[sMeta].remove(sProject); + } } QString projectModelDlg::getItemDataType(const QStandardItem* pItem) @@ -872,27 +1437,22 @@ QString projectModelDlg::getItemDataType(const QStandardItem* pItem) return dataTypePart; } -bool projectModelDlg::createPropertyTable(const QString& sProject,MapProperty::Iterator iter,int nLinkType) +bool projectModelDlg::createPropertyTable(const QString& sProject,const QString& sGroup,QList lstSelect,QList lstBase,int nLinkType) { - QString sName = _curMeta + QString("_") + sProject + QString("_")+iter.key(); + QString sName = _curMeta + QString("_") + sProject + QString("_")+sGroup; QStringList fields; fields.append("id SERIAL NOT NULL PRIMARY KEY"); fields.append("global_uuid uuid NOT NULL DEFAULT gen_random_uuid()"); fields.append("attribute_group VARCHAR(64) NOT NULL"); - QStandardItemModel* pSelectModel = iter->pSelect; - QStandardItem *rootItem = pSelectModel->invisibleRootItem(); - - for (int row = 0; row < rootItem->rowCount(); ++row) { //遍历已选择列表 - QStandardItem *childItem = rootItem->child(row); - if (childItem) { - QPair pair = combinePropertySql(childItem); //拼接单句sql - fields.append(pair.first); - } + for(auto &item:lstSelect) + { + QPair pair = combinePropertySql(item); //拼接单句sql + fields.append(pair.first); } - QJsonObject objState = getSelectedState(iter); + QJsonObject objState = getSelectedState(lstSelect,lstBase); if(!DataBase::GetInstance()->createDynamicTable(sName,fields)) { @@ -900,74 +1460,175 @@ bool projectModelDlg::createPropertyTable(const QString& sProject,MapProperty::I } else { - DataBase::GetInstance()->insertProjectManager(sName,sProject,_curMeta,iter.key(),nLinkType,objState); + DataBase::GetInstance()->insertProjectManager(sName,sProject,_curMeta,sGroup,nLinkType,objState); return true; } } -QJsonObject projectModelDlg::getSelectedState(MapProperty::Iterator iter) +QJsonObject projectModelDlg::getSelectedState(QList select,QList base) { QJsonObject objState; QJsonArray arrState; - QStandardItemModel* pSelectModel = iter->pSelect; - QStandardItem *rootItem = pSelectModel->invisibleRootItem(); + for(auto &item:select) + { + QString dataType = item->data(DataType).toString(); + int lengthPrecision = item->data(LengthPrecision).toInt(); + int scale = item->data(Scale).toInt(); + QString defaultValue = item->data(DefaultValue).toString(); - for (int row = 0; row < rootItem->rowCount(); ++row) { //遍历已选择列表 - QStandardItem *childItem = rootItem->child(row); - if (childItem) { - - QString dataType = childItem->data(DataType).toString(); - int lengthPrecision = childItem->data(LengthPrecision).toInt(); - int scale = childItem->data(Scale).toInt(); - QString defaultValue = childItem->data(DefaultValue).toString(); - - QString dataTypePart = dataType; //拼接数据类型 - if (lengthPrecision > 0) { - dataTypePart += QString("(%1").arg(lengthPrecision); - if (scale > 0) { - dataTypePart += QString(",%1").arg(scale); - } - dataTypePart += ")"; + QString dataTypePart = dataType; //拼接数据类型 + if (lengthPrecision > 0) { + dataTypePart += QString("(%1").arg(lengthPrecision); + if (scale > 0) { + dataTypePart += QString(",%1").arg(scale); } - - QJsonObject node; //保存已选择状态 - node["name"] = childItem->text(); - node["checked"] = 1; - node["type"] = dataTypePart; - node["defaultValue"] = defaultValue; - node["lengthPrecision"] = lengthPrecision; - arrState.append(node); + dataTypePart += ")"; } - } - QStandardItemModel* pBaseModel = iter->pBase; - rootItem = pBaseModel->invisibleRootItem(); - for (int row = 0; row < rootItem->rowCount(); ++row) { //遍历未选择列表 - QStandardItem *childItem = rootItem->child(row); - if (childItem) { - QString dataType = childItem->data(DataType).toString(); - int lengthPrecision = childItem->data(LengthPrecision).toInt(); - int scale = childItem->data(Scale).toInt(); - QString defaultValue = childItem->data(DefaultValue).toString(); - QString dataTypePart = dataType; //拼接数据类型 - if (lengthPrecision > 0) { - dataTypePart += QString("(%1").arg(lengthPrecision); - if (scale > 0) { - dataTypePart += QString(",%1").arg(scale); - } - dataTypePart += ")"; + QJsonObject node; //保存已选择状态 + node["name"] = item->text(); + node["checked"] = 1; + node["type"] = dataTypePart; + node["defaultValue"] = defaultValue; + node["lengthPrecision"] = lengthPrecision; + arrState.append(node); + } + + for(auto &item:base) + { + QString dataType = item->data(DataType).toString(); + int lengthPrecision = item->data(LengthPrecision).toInt(); + int scale = item->data(Scale).toInt(); + QString defaultValue = item->data(DefaultValue).toString(); + + QString dataTypePart = dataType; //拼接数据类型 + if (lengthPrecision > 0) { + dataTypePart += QString("(%1").arg(lengthPrecision); + if (scale > 0) { + dataTypePart += QString(",%1").arg(scale); } - - QJsonObject node; //保存未选择状态 - node["name"] = childItem->text(); - node["checked"] = 0; - node["type"] = dataTypePart; - node["defaultValue"] = defaultValue; - node["lengthPrecision"] = lengthPrecision; - arrState.append(node); + dataTypePart += ")"; } + + QJsonObject node; //保存未选择状态 + node["name"] = item->text(); + node["checked"] = 0; + node["type"] = dataTypePart; + node["defaultValue"] = defaultValue; + node["lengthPrecision"] = lengthPrecision; + arrState.append(node); } + objState["checkState"] = arrState; return objState; } + +QList projectModelDlg::getGroupSub(QStandardItemModel* pModel,const QString& str) +{ + QList lst; + if(!pModel) + return lst; + QList items = pModel->findItems(str); + if (!items.isEmpty()) { + // 存在该文本的项 + QStandardItem* item = items[0]; + for (int row = 0; row < item->rowCount(); ++row) { + // 默认获取第 0 列的子项 + QStandardItem* child = item->child(row, 0); + if (child) { + lst.append(child); + } + } + } + return lst; +} + +void projectModelDlg::setupUI() +{ + QStringList headerText; + headerText<<"工程模"<<"元模型"<<"元件类型"; + ui->tableWidget_model->setContextMenuPolicy(Qt::CustomContextMenu); + ui->tableWidget_model->setSelectionMode(QAbstractItemView::SingleSelection); + ui->tableWidget_model->setSelectionBehavior(QAbstractItemView::SelectRows); + ui->tableWidget_model->setColumnCount(headerText.count()); + ui->tableWidget_model->setHorizontalHeaderLabels(headerText); + ui->tableWidget_model->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + + // 设置列代理 + ProjectTableDelegate* delegate = new ProjectTableDelegate(this); + ui->tableWidget_model->setItemDelegate(delegate); + + connect(delegate,&ProjectTableDelegate::editingFinished,this,&projectModelDlg::onDelegateFinishEdit); +} + +void projectModelDlg::initialTypeMap() +{ + _mapType.insert(QString::fromWCharArray(L"断路器"),1); + _mapType.insert(QString::fromWCharArray(L"母线"),2); + _mapType.insert(QString::fromWCharArray(L"异步电动机"),3); +} + +int projectModelDlg::getLevel(QStandardItem *item) { + int level = 0; + QStandardItem *parent = item->parent(); + if(parent) + { + while (parent) { + level++; + parent = parent->parent(); + } + return level; + } + else{ + return -1; + } + +} + +projectState projectModelDlg::couldSave() +{ + QMap map = DataBase::GetInstance()->getCheckStateFromManager(_curProject); + if(map.isEmpty()) + { + return NotExist; + } + else + { + bool val = ifProjectEqual(map); + if(val){ + return Exist; + } + else{ + return Changed; + } + } +} + +void projectModelDlg::setTableItemState(int row,TableItemState state) +{ + QTableWidgetItem *item = ui->tableWidget_model->item(row, 0); + if(item) + { + item->setData(Qt::UserRole,state); + } +} + +int projectModelDlg::getModelEditState() +{ + int res = 0; + int totalRows = ui->tableWidget_model->rowCount(); + + // 遍历每一行 + for (int row = 0; row < totalRows; ++row) { + // 获取当前行第一列(列索引 0)的 QTableWidgetItem + QTableWidgetItem *item = ui->tableWidget_model->item(row, 0); + + // 检查项是否存在 + if (item != nullptr) { + int role = item->data(Qt::UserRole).toInt(); + res |= role; + } + } + return res; +} diff --git a/source/projectTableDelegate.cpp b/source/projectTableDelegate.cpp new file mode 100644 index 0000000..06aea6e --- /dev/null +++ b/source/projectTableDelegate.cpp @@ -0,0 +1,153 @@ +#include +#include +#include + +#include "projectTableDelegate.h" +#include "selectorDialog.h" +#include "global.h" + +ProjectTableDelegate::ProjectTableDelegate(QObject *parent) + : QStyledItemDelegate(parent) +{ + +}; + +ProjectTableDelegate::~ProjectTableDelegate() +{ + +} + +QWidget* ProjectTableDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, + const QModelIndex& index) const +{ + if(index.column() == TD_ProjectModel) //editline + { + QLineEdit *editor = new QLineEdit(parent); + + // 连接编辑完成信号 + connect(editor, &QLineEdit::editingFinished, this, [this, editor, index]() { + emit editingFinished(index, editor->text()); + }); + + return editor; + } +} + +/*bool ProjectTableDelegate::eventFilter(QObject* obj, QEvent* event) +{ + if (event->type() == QEvent::KeyPress) { + QKeyEvent* keyEvent = static_cast(event); + if (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter) { + QLineEdit* editor = qobject_cast(obj); + if (editor) { + emit yourCustomSignal(editor->text()); + commitData(editor); // 显式提交数据 + closeEditor(editor); // 关闭编辑器 + return true; // 阻止事件继续传播 + } + } + } + return QStyledItemDelegate::eventFilter(obj, event); +}*/ + +/*void ProjectTableDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const +{ + if(index.column() == TD_MetaModel) + { + QComboBox* comboBox = static_cast(editor); + comboBox->setCurrentText(index.data(Qt::EditRole).toString()); + } +} + +void ProjectTableDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, + const QModelIndex& index) const +{ + if(index.column() == TD_MetaModel) + { + QComboBox* comboBox = static_cast(editor); + model->setData(index, comboBox->currentText(), Qt::EditRole); + + emit editingFinished(index, comboBox->currentText()); //发送自定义信号 + } + +}*/ + +bool ProjectTableDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, + const QStyleOptionViewItem& option, const QModelIndex& index) +{ + if (event->type() == QEvent::MouseButtonDblClick) { + if(index.column() == TD_ProjectModel) + { + + } + else if(index.column() == TD_MetaModel) + { + SelectorDialog dialog(option.widget->parentWidget()->parentWidget()->parentWidget()->parentWidget()); + dialog.initial(ST_MetaModel); + if(dialog.exec() == QDialog::Accepted) { + QString component = dialog.selectedComponent(); + if(!component.isEmpty()) { + model->setData(index, component, Qt::EditRole); + emit editingFinished(index,component); + } + } + return true; + } + else if(index.column() == TD_ComponentType) + { + SelectorDialog dialog(option.widget->parentWidget()->parentWidget()->parentWidget()->parentWidget()); + dialog.initial(ST_ComponentType); + if(dialog.exec() == QDialog::Accepted) { + QString component = dialog.selectedComponent(); + if(!component.isEmpty()) { + model->setData(index, component, Qt::EditRole); + emit editingFinished(index,component); + } + } + return true; + } + } + return QStyledItemDelegate::editorEvent(event, model, option, index); +} + +void ProjectTableDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const +{ + //根据行号设置交替色 + QStyleOptionViewItem opt = option; + initStyleOption(&opt, index); + + QModelIndex firstColIndex = index.sibling(index.row(), 0); + TableItemState state = TableItemState(firstColIndex.data(Qt::UserRole).toInt()); + + /*if(index.column() == 0 && state == TS_create) + { + opt.palette.setColor(QPalette::Text, Qt::red); + } + else if(index.column() == 0 && state == TS_select) + { + opt.palette.setColor(QPalette::Text, Qt::green); + } + else if(index.column() == 0 && state == TS_edit) + { + opt.palette.setColor(QPalette::Text, Qt::yellow); + } + QStyledItemDelegate::paint(painter, opt, index);*/ + + + if(state == TS_create) + { + opt.palette.setColor(QPalette::Text, Qt::red); + } + else if(state == TS_select) + { + opt.palette.setColor(QPalette::Text, Qt::green); + } + else if(state == TS_edit) + { + opt.palette.setColor(QPalette::Text, Qt::yellow); + } + + //先执行默认绘制(包括背景、文本等基础元素) + QStyledItemDelegate::paint(painter, opt, index); + +} diff --git a/source/renameModel.cpp b/source/renameModel.cpp index 10b8c66..fb929a4 100644 --- a/source/renameModel.cpp +++ b/source/renameModel.cpp @@ -63,7 +63,7 @@ void RenameModel::setShowName() } } -projectState RenameModel::couldSave() +/*projectState RenameModel::couldSave() { if(_pParent) { @@ -93,11 +93,11 @@ projectState RenameModel::couldSave() } } } -} +}*/ void RenameModel::onOkClicked() { - if(_pParent) + /*if(_pParent) { projectState state = couldSave(); switch(state){ @@ -140,7 +140,7 @@ void RenameModel::onOkClicked() ui->label_info->clear(); break; } - } + }*/ } void RenameModel::onCancelClicked() diff --git a/source/selectorDialog.cpp b/source/selectorDialog.cpp new file mode 100644 index 0000000..951e9ec --- /dev/null +++ b/source/selectorDialog.cpp @@ -0,0 +1,94 @@ +#include +#include "selectorDialog.h" +#include "global.h" +#include "dataBase.h" + +SelectorDialog::SelectorDialog(QWidget* parent) + : QDialog(parent) + ,m_buttonBox(nullptr) +{ + this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); +} + +void SelectorDialog::initial(SelectorDialogType tpe) +{ + m_dlgType = tpe; + setupUI(); + setupConnections(); +} + +void SelectorDialog::setupUI() { + setWindowTitle("选择类型"); + setFixedSize(200, 200); + + m_listView = new QListView(this); + QStandardItemModel* model = initialModel(); + m_listView->setModel(model); + m_listView->setEditTriggers(QAbstractItemView::NoEditTriggers); + + m_buttonBox = new QDialogButtonBox( + QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + + QVBoxLayout* layout = new QVBoxLayout(this); + layout->addWidget(m_listView); + layout->addWidget(m_buttonBox); +} + +QStandardItemModel * SelectorDialog::initialModel() +{ + QStandardItemModel *model = new QStandardItemModel(this); + if(m_dlgType == ST_MetaModel){ + QStringList metas = getMetaList(); + for(auto &meta:metas) + { + QStandardItem *item = new QStandardItem(); + //item->setIcon(QIcon(":/icons/folder.png")); // 设置图标 + item->setText(meta); // 设置文本 + model->appendRow(item); + } + } + else if(m_dlgType == ST_ComponentType){ + QStringList components = {"断路器", "母线", "异步电动机"}; + for(auto &obj:components) + { + QStandardItem *item = new QStandardItem(); + //item->setIcon(QIcon(":/icons/folder.png")); // 设置图标 + item->setText(obj); // 设置文本 + //item->setData("Extra Data for Item 1", Qt::UserRole); // 设置额外属性 + + model->appendRow(item); + } + } + + return model; +} + +void SelectorDialog::setupConnections() { + connect(m_listView, &QListView::doubleClicked, [this](const QModelIndex& index){ + m_selectedComponent = index.data().toString(); + accept(); + }); + + connect(m_buttonBox, &QDialogButtonBox::accepted, [this]{ + if(auto index = m_listView->currentIndex(); index.isValid()) { + m_selectedComponent = index.data().toString(); + } + accept(); + }); + + connect(m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); +} + +QStringList SelectorDialog::getMetaList() const +{ + QMap modelMap = DataBase::GetInstance()->ModelType(); + + QSet modelSet; + for(auto &model:modelMap) + { + modelSet.insert(model.modelType); + } + + return QStringList(modelSet.values()); +} + diff --git a/ui/projectModelDlg.ui b/ui/projectModelDlg.ui index 7073534..fb6f5b0 100644 --- a/ui/projectModelDlg.ui +++ b/ui/projectModelDlg.ui @@ -57,9 +57,12 @@ Qt::Orientation::Vertical + + color: rgb(15, 15, 15); + - 0 + 4 0 @@ -86,91 +89,60 @@ color: rgb(8, 8, 8); - - - - 12 - + + + QTableView +{ + outline:0px; +} +QTableView::item +{ + border:0px; + background-color:transparent; +} +QTableView::item:hover +{ + background-color:transparent; +} +QTableView::item:selected +{ + color:rgb(0,0,0); + background-color:rgb(211, 241, 250); +} - - false - + + + + + + + 12 + + + + 新建 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + - - - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - background-color: rgb(165, 165, 165); -font: 12pt "Microsoft YaHei UI"; -color: rgb(8, 8, 8); - - - 工程模类型 - - - - - - - - - - font: 12pt "Microsoft YaHei UI"; -color: rgb(8, 8, 8); - - - 关联状态: - - - - - - - - - - @@ -188,22 +160,8 @@ QWidget{ } - - - - false - - - - - - - >> - - - - - + + Qt::Orientation::Vertical @@ -215,7 +173,14 @@ QWidget{ - + + + + >> + + + + @@ -253,7 +218,7 @@ QWidget{ - 取消 + 关闭 @@ -272,131 +237,14 @@ QWidget{ - - - - Qt::Orientation::Vertical - - - - 20 - 156 - - - - - + false - - - - << - - - - - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - - Microsoft YaHei UI - 12 - false - false - - - - - - - 元模: - - - - - - - - - - - Microsoft YaHei UI - 12 - false - false - - - - - - - 工程模: - - - - - - - false - - - - - - - - Microsoft YaHei UI - 12 - false - false - - - - - - - 属性类别: - - - - - - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - + background-color: rgb(165, 165, 165); @@ -408,7 +256,21 @@ color: rgb(8, 8, 8); - + + + + << + + + + + + + false + + + + background-color: rgb(165, 165, 165); @@ -420,6 +282,19 @@ color: rgb(8, 8, 8); + + + + Qt::Orientation::Vertical + + + + 20 + 156 + + + +