From e18ff1a59ad00b07c85844f5770509fb32cbd469 Mon Sep 17 00:00:00 2001 From: baiYue Date: Tue, 4 Mar 2025 09:44:03 +0800 Subject: [PATCH] project model generate version v0.5 --- CMakeLists.txt | 6 + common/include/dataBase.h | 74 ++++ common/include/global.h | 14 + common/source/dataBase.cpp | 370 +++++++++++++++++++- include/mainwindow.h | 3 + include/projectModelDlg.h | 74 ++++ include/renameModel.h | 36 ++ source/mainwindow.cpp | 29 +- source/projectModelDlg.cpp | 667 +++++++++++++++++++++++++++++++++++++ source/renameModel.cpp | 105 ++++++ ui/mainwindow.ui | 6 + ui/projectModelDlg.ui | 469 ++++++++++++++++++++++++++ ui/renameModel.ui | 177 ++++++++++ 13 files changed, 1998 insertions(+), 32 deletions(-) create mode 100644 include/projectModelDlg.h create mode 100644 include/renameModel.h create mode 100644 source/projectModelDlg.cpp create mode 100644 source/renameModel.cpp create mode 100644 ui/projectModelDlg.ui create mode 100644 ui/renameModel.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d0ffe0..a67d1cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,8 @@ set(H_HEADER_FILES include/toolPage.h include/toolBox.h include/loadPageDlg.h + include/projectModelDlg.h + include/renameModel.h common/include/global.h common/include/dataBase.h @@ -65,6 +67,8 @@ set(CPP_SOURCE_FILES source/toolPage.cpp source/toolBox.cpp source/loadPageDlg.cpp + source/projectModelDlg.cpp + source/renameModel.cpp common/source/dataBase.cpp common/source/httpInterface.cpp @@ -73,6 +77,8 @@ set(UI_FILES ui/mainwindow.ui ui/graphicElementsPanel.ui ui/loadPageDlg.ui + ui/projectModelDlg.ui + ui/renameModel.ui ) # 包含源文件目录 diff --git a/common/include/dataBase.h b/common/include/dataBase.h index c9f0d9b..256b581 100644 --- a/common/include/dataBase.h +++ b/common/include/dataBase.h @@ -6,6 +6,50 @@ #include #include +struct attributeGroup //属性组(元模) +{ + int id = 0; + QString group; + QString groupName; +}; + +struct dataType //数据类型(元模) +{ + int id = 0; + QString dataType; + QString databaseType; +}; + +struct attribute //属性表(元模属性字段) +{ + int id = 0; + QString attribute; //属性名 + QString dataType; //数据类型 + int lengthPrecision=0; //长度限制(varchar) + int scale=0; //小数点位数 + QString defaultValue; //默认值 + QString valueRange; //数值范围 + int attributeGroup=0; //属性组 + int isNotNull=0; //是否非空 + int isPrimaryKey=0; //是否主键 +}; + +struct modelAttribute //模型-属性对应表(元模在此表查找) +{ + int id = 0; + QString modelType; //元模名 + int attributeId; //属性id +}; + +struct modelConnectivity //模型连接性表(元模是否可以连接) +{ + int id = 0; + QString fromModel; //属性名 + QString toModel; + int connectivity=0; //是否可连 +}; + +//================================================== struct availableID //可用id { int componentId = -1; @@ -125,18 +169,48 @@ public: void parallelUpdate(); QJsonObject QstringToJson(QString jsonString); +public: + //***********元模 + bool getAttributeGroup(); //获取属性组信息 + bool getDataType(); //获取数据类型信息 + bool getAttribute(); //获取属性 + bool getModelAttribute(); //获取元模 + bool getModelConnectivity(); //获取连接性 + + QMap AttributeGroup() const {return _attributeGroup;} + QMap DataType() const {return _dataType;} + QMap Attribute() const {return _attribute;} + QMap ModelAttribute() const {return _modelAttribute;} + QMap ModelConnectivity() const {return _modelConnectivity;} + //***********工程模 + bool createProjectManager(); //生成记录表,包含工程模名称,属性组名,启用和关闭的属性字段(json类型)[一个属性组建一个表] + bool insertProjectManager(const QString& name,const QString& tag,const QString& metaModel,const QString& groupName,int linkType,QJsonObject checkState); + bool getProjectManager(); + QMap getCheckStateFromManager(const QString& sProject); //获取当前工程模型所有属性的选择状态 <属性名,选择状态> + bool createDynamicTable(const QString&, const QStringList&); +private: + QMap _attributeGroup; //属性组的组 + QMap _dataType; //数据类型组 + QMap _attribute; //属性组 + QMap _modelAttribute; //元模组 + QMap _modelConnectivity; //连接性组 private: void initial(); + //bool createProjectDB(); + //void initialProjectDB(); void readXML(); static DataBase* instance; static int _id; QSqlDatabase db; + //QSqlDatabase prodb; QString m_sFileName; QString _DataBaseType; QString _DataBaseName; + //QString _ProjectDB; //工程模数据库名 QString _HostName; int _Port; QString _UserName; QString _PassWord; + }; #endif // DATABASE_H diff --git a/common/include/global.h b/common/include/global.h index cbdf013..bcebac7 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -30,6 +30,20 @@ enum DiagramMode //组态图模式 DM_edit = 0, DM_run }; + +enum Attribute //元模属性字段对照 +{ + Id = Qt::UserRole + 1, + Attribute = Qt::UserRole + 2, + DataType = Qt::UserRole + 3, + LengthPrecision = Qt::UserRole + 4, + Scale = Qt::UserRole + 5, + DefaultValue = Qt::UserRole + 6, + ValueRange = Qt::UserRole + 7, + AttributeGroup = Qt::UserRole + 8, + IsNotNull = Qt::UserRole + 9, + IsPrimaryKey = Qt::UserRole + 10 +}; //Q_ENUM_NS(GraphicsItemType) /** diff --git a/common/source/dataBase.cpp b/common/source/dataBase.cpp index 3cc584b..1ad1913 100644 --- a/common/source/dataBase.cpp +++ b/common/source/dataBase.cpp @@ -16,14 +16,9 @@ DataBase::DataBase() { m_sFileName = QString("setting.xml"); initial(); - //insertComponent(QUuid::createUuid(),QString("111"),QString("111"),QString("111"),QString("111"),QString("111"),QString("111"),QString("111"),1,true,1,QJsonObject(),QJsonObject(),QJsonObject(),1,1); - //insertPage(QString("111"),QString("111"),4,QJsonObject(),QJsonObject(),QString("111"),1); - //insertStation(1,QString("111"),QString("111"),true,1); - //insertGrid(QString("111"),QString("111"),1); - //insertZone(1,QString("111"),QString("111"),1); - //insertTopologic(1,QUuid::createUuid(),QUuid::createUuid(),1,QString("111"),1); - //updateId(); - //deleteComponentById(1); + //createProjectDB(); + //initialProjectDB(); + createProjectManager(); } DataBase::~DataBase() @@ -35,11 +30,11 @@ DataBase::~DataBase() void DataBase::initial() { readXML(); - if (QSqlDatabase::contains("qt_sql_default_connection")) - db = QSqlDatabase::database("qt_sql_default_connection"); + if (QSqlDatabase::contains(_DataBaseName)) + db = QSqlDatabase::database(_DataBaseName); else - db = QSqlDatabase::addDatabase(_DataBaseType); - //db = QSqlDatabase::addDatabase(_DataBaseType); + db = QSqlDatabase::addDatabase(_DataBaseType,_DataBaseName); + db.setDatabaseName(_DataBaseName); db.setHostName(_HostName); db.setPort(_Port); @@ -48,12 +43,45 @@ void DataBase::initial() db.setPassword(_PassWord); if (db.open()) { - qDebug()<<"success"; + qDebug()<<"baseDB success"; } else { - qDebug()<<"failed"; + qDebug()<<"baseDB failed"; } } +/*bool DataBase::createProjectDB() +{ + QSqlQuery query(db); + QString sql = QString("CREATE DATABASE %1").arg(_ProjectDB); + if (!query.exec(sql)) { + qDebug() << "创建数据库失败:" << query.lastError().text(); + return false; + } + return true; +} + +void DataBase::initialProjectDB() +{ + if (QSqlDatabase::contains(_ProjectDB)) + prodb = QSqlDatabase::database(_ProjectDB); + else + prodb = QSqlDatabase::addDatabase(_DataBaseType,_ProjectDB); + + prodb.setDatabaseName(_ProjectDB); + prodb.setHostName(_HostName); + prodb.setPort(_Port); + // 需要改成自己的用户名和密码 + prodb.setUserName(_UserName); + prodb.setPassword(_PassWord); + + if (prodb.open()) { + qDebug()<<"ProjectDB success"; + } else { + //qDebug()<<"ProjectDB failed"; + qDebug()<attributes(); QString tpe = attributes.value("Type").toString(); QString sName = attributes.value("Name").toString(); + //QString sProDB = attributes.value("ProjectDB").toString(); if (tpe == QString("PostgreSQL")) { _DataBaseType = QString("QPSQL"); _DataBaseName = sName; + //_ProjectDB = sProDB; } } else if(m_pReader->name() == QString("HostName")) @@ -847,3 +877,315 @@ QJsonObject DataBase::QstringToJson(QString jsonString) QJsonObject jsonObject = jsonDocument.object(); return jsonObject; } +//=================================元模=============================================// +bool DataBase::getAttributeGroup() +{ + if(db.open()) + { + QSqlQuery qry(db); + bool success = qry.exec("SELECT * FROM attribute_group"); + if (!success) { + qDebug()< DataBase::getCheckStateFromManager(const QString& sProject) +{ + QMap map; + if(sProject == QString::fromWCharArray(L"新建")) + { + return map; + } + if(db.open()) + { + QSqlQuery qry(db); + + qry.prepare("SELECT group_name, check_state FROM project_manager WHERE tag = ?"); + qry.bindValue(0,sProject); + bool res = qry.exec(); + QString str = qry.lastQuery(); + if(!res) + { + qDebug()< +#include +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class projectModelDlg; } +QT_END_NAMESPACE + +struct PropertyPage //属性列表信息 +{ + QStandardItemModel* pBase; //基础属性 + QStandardItemModel* pSelect; //已选择属性 + QMap mCheckState; //属性选择状态 +}; + +typedef QMap MapProperty; //str为属性名,model1基础属性,model2已选择属性 +struct PropertyModel //工程模 +{ + MapProperty mapProperty; + int nType; //工程模类型,选择图标后确定 +}; +typedef QMap MapProject; //str为工程名,property为属性集 +typedef QMap MapMeta; //str为元模名,project为工程模集 + +class RenameModel; + +class projectModelDlg : public QDialog +{ + Q_OBJECT + +public: + projectModelDlg(QWidget *parent = nullptr); + ~projectModelDlg(); + + void initial(); + void initialModel(); + void initialList(); + MapProperty addNewProject(const QString& sMeta,const QString& sProject); //根据元模型、工程模名称生成工程模对象 + void update(); + void generate(const QString&); //根据输入名称生成表 + + QString getProjectName() const; //返回当前选择项目的名称 +public slots: + void onSaveClicked(); + void onCancelClicked(); + void onGenerateClicked(); + void onApplyClicked(); + void onRevokeClicked(); + void onBaseModelIndexChanged(const QString&); + void onProjectIndexChanged(const QString&); + void onPropertyIndexChanged(const QString&); + void onIconClicked(const QModelIndex &index); //关联图元改变 +public: + QStringList getModelList() const; //获取元模型列表 + QStringList getGroupList(const QString& model) const; //返回该元模下的属性组列表 + QStringList getAttributeList(const QString& model,const QString& group) const; //根据元模名和组名返回属性列表 + void setItemAttribute(const QString&,QStandardItem*); //设置item的属性(数据库表字段名) + QString combinePropertySql(const QStandardItem*); //根据item属性生成sql +private: + void updateIconList(); //选择工程模后刷新关联图标 +private: + Ui::projectModelDlg *ui; + RenameModel* m_pRenameModel; + QStandardItemModel* _viewModel; //索引view模型 + MapMeta m_mapTotal; + QString _curMeta; //当前元模型 + QString _curProject; //当前工程模 + QString _curProperty; //当前属性 +}; + +#endif diff --git a/include/renameModel.h b/include/renameModel.h new file mode 100644 index 0000000..9c685c9 --- /dev/null +++ b/include/renameModel.h @@ -0,0 +1,36 @@ +#ifndef RENAMEMODEL_H +#define RENAMEMODEL_H + +#include +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class renameModel; } +QT_END_NAMESPACE + +class projectModelDlg; + +class RenameModel : public QDialog +{ + Q_OBJECT + +public: + RenameModel(QWidget *parent = nullptr); + ~RenameModel(); + + void initial(); + void showCenter(); +signals: + void selectedPage(const QString&); +public slots: + void onOkClicked(); + void onCancelClicked(); +private: + void setShowName(); //获取当前名称并显示 + bool couldSave(); //判断当前名称是否可用 +private: + Ui::renameModel *ui; + projectModelDlg* _pParent; +}; + +#endif diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index 222281d..1257bc1 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -22,6 +22,7 @@ #include "electricElementsPanel.h" #include "toolBox.h" #include "loadPageDlg.h" +#include "projectModelDlg.h" //using namespace ads; @@ -62,13 +63,6 @@ void CMainWindow::changeEvent(QEvent* event) void CMainWindow::initializeDockUi() { - /*ElectricElementsPanel* pPanel1 = new ElectricElementsPanel(); - QMap map1; - map1.insert(QString::fromWCharArray(L"三角"),GIT_rect); - map1.insert(QString::fromWCharArray(L"四边"),GIT_rect); - pPanel1->setData(map1); - pPanel1->show();*/ - m_pElectricElementsBox = new ElectricElementsBox(); m_pElectricElementsBox->initial(); QWidget* pBox = m_pElectricElementsBox->getToolBox(); @@ -83,17 +77,7 @@ void CMainWindow::initializeDockUi() this->setCentralWidget(m_pDiagramCavas); connect(m_pElectricElementsBox,&ElectricElementsBox::addEletricItem,m_pDiagramCavas,&DiagramCavas::onSignal_addGraphicsItem); - /*QTableWidget* propertiesTable = new QTableWidget(); - propertiesTable->setColumnCount(3); - propertiesTable->setRowCount(10); - CDockWidget* PropertiesDockWidget = new CDockWidget(QString::fromWCharArray(L"属性编辑器")); - PropertiesDockWidget->setWidget(propertiesTable); - PropertiesDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget); - PropertiesDockWidget->resize(250, 150); - PropertiesDockWidget->setMinimumSize(200,150); - DockManager->addDockWidget(DockWidgetArea::RightDockWidgetArea, PropertiesDockWidget, CentralDockArea); - ui->menuView->addAction(PropertiesDockWidget->toggleViewAction());*/ - + m_pProjectModelDlg = new projectModelDlg(this); } void CMainWindow::initializeAction() @@ -127,6 +111,9 @@ void CMainWindow::initializeAction() QAction* actRun = ui->menuMode->addAction(QString::fromWCharArray(L"运行")); connect(actRun,&QAction::triggered,m_pDiagramCavas,&DiagramCavas::onSignal_runPage); + + QAction* actEdit = ui->menuProject->addAction(QString::fromWCharArray(L"编辑工程模")); + connect(actEdit,&QAction::triggered,this,&CMainWindow::onAction_editProject); } void CMainWindow::onAction_zoomIn() @@ -174,6 +161,12 @@ void CMainWindow::onAction_destroyGroup() }*/ } +void CMainWindow::onAction_editProject() +{ + if(m_pProjectModelDlg) + m_pProjectModelDlg->show(); +} + void CMainWindow::onSignal_addItem(QGraphicsItem* item) { if(item) diff --git a/source/projectModelDlg.cpp b/source/projectModelDlg.cpp new file mode 100644 index 0000000..48940bc --- /dev/null +++ b/source/projectModelDlg.cpp @@ -0,0 +1,667 @@ +#include +#include +#include "projectModelDlg.h" +#include "renameModel.h" +#include "dataBase.h" +#include "ui_projectModelDlg.h" +#include "global.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) +{ + ui->setupUi(this); + this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); + setWindowModality(Qt::WindowModal); + m_pRenameModel = new RenameModel(this); + if(m_pRenameModel) + m_pRenameModel->hide(); + initial(); +} + +projectModelDlg::~projectModelDlg() +{ + delete ui; +} + +void projectModelDlg::initial() +{ + connect(ui->btn_generate,&QPushButton::clicked,this,&projectModelDlg::onGenerateClicked); + 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); + + initialModel(); + initialList(); + update(); +} + +MapProperty projectModelDlg::addNewProject(const QString& sMeta,const QString& sProject) //todo:保存后生成新建 +{ + MapProperty mt; + QStringList lstProperty = getGroupList(sMeta); + //lstProperty< mapCheckState = DataBase::GetInstance()->getCheckStateFromManager(sProject); //获取选择状态 + if(mapCheckState.isEmpty()) //无返回值,是新建目标 + { + for(auto &property:lstProperty) + { + //todo:读取属性信息 + QStringList lstName = getAttributeList(sMeta,property); + //lstName<appendRow(new QStandardItem(property)); //总览view + + for(auto &name:lstName) + { + QStandardItem* pItem = new QStandardItem(name); + setItemAttribute(name,pItem); + struProperty.pBase->appendRow(pItem); + struProperty.mCheckState.insert(name,0); //初始都是未选择状态 + } + mt.insert(property,struProperty); + } + } + else + { + for(auto &property:lstProperty) + { + QJsonObject obj = mapCheckState[property]; + QJsonArray nodesJsonArray = obj["checkState"].toArray(); + + PropertyPage struProperty; + struProperty.pBase = new QStandardItemModel(this); + struProperty.pSelect = new QStandardItemModel(this); + for (QJsonValueRef nodeJson : nodesJsonArray) + { + QJsonObject node = nodeJson.toObject(); + QString propertyName = node["name"].toString(); + int nState = node["checked"].toInt(); + + QStandardItem* pItem = new QStandardItem(propertyName); + setItemAttribute(propertyName,pItem); + if(nState) + { + struProperty.pSelect->appendRow(pItem); + struProperty.mCheckState.insert(propertyName,1); + } + else + { + struProperty.pBase->appendRow(pItem); + struProperty.mCheckState.insert(propertyName,0); + } + } + mt.insert(property,struProperty); + } + } + + return mt; +} + +void projectModelDlg::initialModel() +{ + _viewModel = new QStandardItemModel(this); + QStringList lstModel = getModelList(); + //lstType<appendRow(propertyItem); //总览view名称 + + PropertyModel pm; + pm.mapProperty = addNewProject(model,proj); + mp.insert(proj,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); + + 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); + + connect(ui->listView_icon,&QListView::clicked,this,&projectModelDlg::onIconClicked); +} + +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) +{ + QString pre = QString("project_"); + MapMeta::Iterator iter = m_mapTotal.find(_curMeta); //获取元模下的工程 + if(iter != m_mapTotal.end()) + { + MapProject mp = iter.value(); + MapProject::Iterator ite = mp.find(_curProject); //获取工程下的属性组 + if(ite != mp.end()) + { + MapProperty mapProperty = ite.value().mapProperty; + + bool createRes = true; //动态表生成结果 + for(MapProperty::Iterator it = mapProperty.begin();it != mapProperty.end();++it){ //每个属性组单独生成表 + QUuid uuid = QUuid::createUuid(); + // 不带花括号的 UUID 字符串 + QString noDashes = uuid.toString(QUuid::WithoutBraces); + QString uuidString = noDashes.replace("-", ""); + QString sName = pre+it.key()+QString("_")+uuidString; //生成表名 + + 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"); + + QJsonObject objState; + QJsonArray arrState; + + QStandardItemModel* pSelectModel = it->pSelect; + QStandardItem *rootItem = pSelectModel->invisibleRootItem(); + for (int row = 0; row < rootItem->rowCount(); ++row) { //遍历已选择列表 + QStandardItem *childItem = rootItem->child(row); + if (childItem) { + QString s = combinePropertySql(childItem); //拼接单句sql + fields.append(s); + + QJsonObject node; //保存已选择状态 + node["name"] = rootItem->text(); + node["checked"] = 1; + arrState.append(node); + } + } + QStandardItemModel* pBaseModel = it->pBase; + rootItem = pBaseModel->invisibleRootItem(); + for (int row = 0; row < rootItem->rowCount(); ++row) { //遍历未选择列表 + QStandardItem *childItem = rootItem->child(row); + if (childItem) { + QJsonObject node; //保存未选择状态 + node["name"] = rootItem->text(); + node["checked"] = 0; + arrState.append(node); + } + } + + if(!DataBase::GetInstance()->createDynamicTable(sName,fields)) + { + createRes = false; + } + else + { + objState["checkState"] = arrState; + DataBase::GetInstance()->insertProjectManager(sName,str,_curMeta,it.key(),ite.value().nType,objState); + } + } + if(createRes) + { + PropertyModel pm = m_mapTotal[_curMeta].take(_curProject); //取出要保存的对象,另存为新索引 + m_mapTotal[_curMeta].insert(str,pm); + + if(_curProject == QString::fromWCharArray(L"新建")) + { + ui->cb_projectModel->addItem(str); + addNewProject(_curMeta,_curProject); + QList lst = _viewModel->findItems(_curMeta); + if(lst.size() == 1) + { + QStandardItem* item = lst[0]; + item->appendRow(new QStandardItem(str)); + } + } + _curProject = str; + + } + else //创建失败 + { + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"创建表失败")); + } + } + } + +} + +QString projectModelDlg::getProjectName() const +{ + return _curProject; +} + +void projectModelDlg::onSaveClicked() +{ + if(_curProject.isEmpty()) + { + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"请选择操作的工程对象")); + } + else + { + if(_curProject == QString::fromWCharArray(L"新建")) + { + if(m_pRenameModel) + { + m_pRenameModel->showCenter(); + } + } + } +} + +void projectModelDlg::onGenerateClicked() +{ + +} + +void projectModelDlg::onCancelClicked() +{ + hide(); +} + +void projectModelDlg::onApplyClicked() +{ + if(_curProperty.isEmpty()) + { + 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()) + { + 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()); + property[_curProperty].mCheckState[item->text()] = 1; //选择状态设为1 + } + /*MapProperty::Iterator ite = property.find(_curProperty); + if(ite != property.end()) + { + QStandardItemModel* pBase = ite.value().pBase; + QStandardItemModel* pSelect = ite.value().pSelect; + + QModelIndex selected = ui->treeView_base->currentIndex(); + QStandardItem* item = pBase->takeItem(selected.row()); // 根据index获取当前item + if(item) + { + pSelect->appendRow(item); + pBase->removeRow(selected.row()); + } + }*/ + } + } + } +} + +void projectModelDlg::onRevokeClicked() +{ + if(_curProperty.isEmpty()) + { + 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()) + { + 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()); + property[_curProperty].mCheckState[item->text()] = 0; //选择状态设为0 + } + /*MapProperty::Iterator ite = property.find(_curProperty); + if(ite != property.end()) + { + QStandardItemModel* pBase = ite.value().pBase; + QStandardItemModel* pSelect = ite.value().pSelect; + + QModelIndex selected = ui->treeView_sub->currentIndex(); + QStandardItem* item = pSelect->takeItem(selected.row()); // 根据index获取当前item + if(item) + { + pBase->appendRow(item); + pSelect->removeRow(selected.row()); + } + }*/ + } + } + } +} + +void projectModelDlg::onBaseModelIndexChanged(const QString& str) +{ + if(_curMeta == str) //选择未改变 + { + return; + } + if(ui->stackedWidget->currentIndex() !=1) //选择元模时隐藏iconlist + { + ui->stackedWidget->setCurrentIndex(1); + } + ui->treeView_base->setModel(nullptr); + ui->treeView_sub->setModel(nullptr); + MapMeta::Iterator iter = m_mapTotal.find(str); + if(iter != m_mapTotal.end()) + { + //先清空已有 + _curMeta = str; + _curProject = ""; + _curProperty = ""; + ui->cb_projectModel->clear(); + ui->cb_property->clear(); + MapProject project = iter.value(); + for(MapProject::Iterator it = project.begin();it != project.end();++it) + { + ui->cb_projectModel->addItem(it.key()); + } + } +} + +void projectModelDlg::onProjectIndexChanged(const QString& str) +{ + if(_curMeta.isEmpty()) + { + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"请先选择元模型")); + } + else + { + updateIconList(); + if(_curProject == str) //选择未改变 + { + return; + } + ui->treeView_base->setModel(nullptr); + ui->treeView_sub->setModel(nullptr); + MapMeta::Iterator iter = m_mapTotal.find(_curMeta); + if(iter != m_mapTotal.end()) + { + MapProject project = iter.value(); + MapProject::Iterator it= project.find(str); + if(it != project.end()) + { + _curProject = str; + _curProperty = ""; + ui->cb_property->clear(); + MapProperty property = it.value().mapProperty; + for(MapProperty::Iterator ite = property.begin();ite != property.end();++ite) + { + ui->cb_property->addItem(ite.key()); + } + } + } + } +} + +void projectModelDlg::onPropertyIndexChanged(const QString& str) +{ + if(_curProject.isEmpty()) + { + QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"请先选择工程模型")); + } + else + { + if(_curProperty == str) + { + return; + } + ui->treeView_base->setModel(nullptr); + ui->treeView_sub->setModel(nullptr); + 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()) + { + MapProperty property = it.value().mapProperty; + MapProperty::Iterator ite = property.find(str); + if(ite != property.end()) + { + _curProperty = str; + ui->treeView_base->setModel(nullptr); + ui->treeView_sub->setModel(nullptr); + QStandardItemModel* pBase = ite.value().pBase; + QStandardItemModel* pSelect = ite.value().pSelect; + ui->treeView_base->setModel(pBase); + ui->treeView_sub->setModel(pSelect); + } + } + } + } +} + +void projectModelDlg::onIconClicked(const QModelIndex &index) +{ + QStandardItemModel *model = dynamic_cast(ui->listView_icon->model()); + if(model) + { + QStandardItem* pItem = model->itemFromIndex(index); + int id = pItem->data(Qt::UserRole).toInt(); + } +} + +//============================================================================= +QStringList projectModelDlg::getModelList() const +{ + QMap modelMap = DataBase::GetInstance()->ModelAttribute(); + + QSet modelSet; + for(auto &model:modelMap) + { + modelSet.insert(model.modelType); + } + + return QStringList(modelSet.values()); +} + +QStringList projectModelDlg::getGroupList(const QString& sM) const +{ + QMap groupMap = DataBase::GetInstance()->AttributeGroup(); + QMap modelMap = DataBase::GetInstance()->ModelAttribute(); + QMap attMap = DataBase::GetInstance()->Attribute(); + + QSet groupSet; + QStringList groupList; + for(auto &model:modelMap) //遍历获取属性组id + { + if(model.modelType == sM) + { + int attId = model.attributeId; + groupSet.insert(attMap[attId].attributeGroup); + } + } + + for(auto &id:groupSet) //取得id对应的组名 + { + groupList.append(groupMap[id].group); + } + return groupList; +} + +QStringList projectModelDlg::getAttributeList(const QString& sM,const QString& sG) const +{ + QMap groupMap = DataBase::GetInstance()->AttributeGroup(); + QMap modelMap = DataBase::GetInstance()->ModelAttribute(); + QMap attMap = DataBase::GetInstance()->Attribute(); + + int groupId = -1; + for(auto &group:groupMap) + { + if(group.group == sG) //根据group获取对应Id + { + groupId = group.id; + break; + } + } + + QSet attSet; + QStringList attList; + if(groupId != -1) + { + for(auto &model:modelMap) //获取当前模型,当前属性组下的属性 + { + if(model.modelType == sM) + { + int attId = model.attributeId; + if(attMap[attId].attributeGroup == groupId) //当前属性的属性组id等于选定的属性组id + { + attSet.insert(model.attributeId); + } + } + } + + for(auto &id:attSet) //取得id对应的组名 + { + attList.append(attMap[id].attribute); + } + return attList; + } + + return QStringList(); +} + +void projectModelDlg::setItemAttribute(const QString& name,QStandardItem* p) +{ + QMap attMap = DataBase::GetInstance()->Attribute(); + + for(auto &att:attMap) + { + if(name == att.attribute) + { + p->setData(att.id,Id); + p->setData(att.attribute,Attribute); + p->setData(att.dataType,DataType); + p->setData(att.lengthPrecision,LengthPrecision); + p->setData(att.scale,Scale); + p->setData(att.defaultValue,DefaultValue); + p->setData(att.valueRange,ValueRange); + p->setData(att.attributeGroup,AttributeGroup); + p->setData(att.isNotNull,IsNotNull); + p->setData(att.isPrimaryKey,IsPrimaryKey); + return; + } + } +} + +QString projectModelDlg::combinePropertySql(const QStandardItem* pItem) +{ + int id = pItem->data(Id).toInt(); + QString attribute = pItem->data(Attribute).toString(); + QString dataType = pItem->data(DataType).toString(); + int lengthPrecision = pItem->data(LengthPrecision).toInt(); + int scale = pItem->data(Scale).toInt(); + QString defaultValue = pItem->data(DefaultValue).toString(); + QString valueRange = pItem->data(ValueRange).toString(); + int attributeGroup = pItem->data(AttributeGroup).toInt(); + int isNotNull = pItem->data(IsNotNull).toInt(); + int isPrimaryKey = pItem->data(IsPrimaryKey).toInt(); + + bool needsQuotes = stringDataTypes.contains(dataType); + // 处理数据类型及其长度精度 + QString dataTypePart = dataType; + if (lengthPrecision > 0) { + dataTypePart += QString("(%1").arg(lengthPrecision); + if (scale > 0) { + dataTypePart += QString(",%1").arg(scale); + } + dataTypePart += ")"; + } + + // 开始拼接SQL + QString sql = QString("%1 %2").arg(attribute, dataTypePart); + + // 处理约束条件 + if (isNotNull != 0) { + sql += " NOT NULL"; + } + + if (!defaultValue.isEmpty()) { + QString defValue = defaultValue; + if (needsQuotes) { + // 转义单引号并包裹 + defValue.replace("'", "''"); + defValue = QString("'%1'").arg(defValue); + } + sql += QString(" DEFAULT %1").arg(defValue); + } + + if (isPrimaryKey != 0) { + sql += " PRIMARY KEY"; + } + + return sql; +} + +void projectModelDlg::updateIconList() +{ + if(ui->stackedWidget->currentIndex() !=0) + { + ui->stackedWidget->setCurrentIndex(0); + } + MapProject mp = m_mapTotal[_curMeta]; + int nType = mp[_curProject].nType; + QStandardItemModel *model = dynamic_cast(ui->listView_icon->model()); + if(model) + { + for (int row = 0; row < model->rowCount(); ++row) + { + QStandardItem* pItem = model->item(row); + int id = pItem->data(Qt::UserRole).toInt(); + if(nType == id) //使用存储的序列号更新list + { + QModelIndex index = model->index(id,0); + ui->listView_icon->setCurrentIndex(index); + + return; + } + } + } +} diff --git a/source/renameModel.cpp b/source/renameModel.cpp new file mode 100644 index 0000000..18d244e --- /dev/null +++ b/source/renameModel.cpp @@ -0,0 +1,105 @@ +#include "renameModel.h" +#include "projectModelDlg.h" +#include "ui_renameModel.h" + +RenameModel::RenameModel(QWidget *parent) + : QDialog(parent) + , ui(new Ui::renameModel) + ,_pParent(nullptr) +{ + ui->setupUi(this); + this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); + _pParent = dynamic_cast(parent); + initial(); +} + +RenameModel::~RenameModel() +{ + delete ui; +} + +void RenameModel::initial() +{ + connect(ui->btn_ok,&QPushButton::clicked,this,&RenameModel::onOkClicked); + connect(ui->btn_cancel,&QPushButton::clicked,this,&RenameModel::onCancelClicked); +} + +void RenameModel::showCenter() +{ + if (!_pParent) { + qWarning("No parent widget found; dialog will appear at the default position."); + show(); + return; + } + + // 父窗口的几何信息 + QRect parentRect = _pParent->geometry(); + + // 对话框的几何信息 + int dialogWidth = width(); + int dialogHeight = height(); + + // 计算中心位置 + int x = parentRect.x() + (parentRect.width() - dialogWidth) / 2; + int y = parentRect.y() + (parentRect.height() - dialogHeight) / 2; + + // 移动对话框到中心位置并显示 + move(x, y); + show(); + + setShowName(); +} + +void RenameModel::setShowName() +{ + if(_pParent) + { + QString str = _pParent->getProjectName(); + ui->lineEdit_name->setText(str); + + ui->lineEdit_name->setSelection(0,str.length()); + } +} + +bool RenameModel::couldSave() +{ + if(_pParent) + { + QString str = _pParent->getProjectName(); + if(str == QString::fromWCharArray(L"新建")) + { + ui->label_info->setText(QString::fromWCharArray(L"请输入需保存的名称")); + return false; + } + else + { + //todo:判断输入的名称是否存在 + return true; + } + } +} + +void RenameModel::onOkClicked() +{ + if(_pParent) + { + if(couldSave()) + { + //todo:保存 + _pParent->generate(ui->lineEdit_name->text()); + hide(); + } + else + { + + } + ui->label_info->clear(); + } +} + +void RenameModel::onCancelClicked() +{ + hide(); + ui->label_info->clear(); +} + diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui index aad9e70..ffdc163 100644 --- a/ui/mainwindow.ui +++ b/ui/mainwindow.ui @@ -38,9 +38,15 @@ 模式 + + + 工程模 + + + diff --git a/ui/projectModelDlg.ui b/ui/projectModelDlg.ui new file mode 100644 index 0000000..f923413 --- /dev/null +++ b/ui/projectModelDlg.ui @@ -0,0 +1,469 @@ + + + projectModelDlg + + + + 0 + 0 + 1021 + 669 + + + + + 12 + + + + Dialog + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QWidget#widget{ + background-color: rgb(232, 232, 232); +} + + + + + + background-color: rgb(200, 200, 200); + + + + + + Qt::Orientation::Vertical + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + background-color: rgb(165, 165, 165); +font: 12pt "Microsoft YaHei UI"; +color: rgb(8, 8, 8); + + + 模型索引 + + + + + + + + 12 + + + + false + + + + + + + + 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); + + + 关联状态: + + + + + + + + + + + + + + + + + + + QWidget#widget_right{ + background-color: rgb(200, 200, 200); +} +QWidget{ + color: rgb(3, 3, 3); + font: 12pt "Microsoft YaHei UI"; +} + + + + + + false + + + + + + + >> + + + + + + + Qt::Orientation::Vertical + + + + 20 + 156 + + + + + + + + + + Qt::Orientation::Horizontal + + + + 28 + 20 + + + + + + + + 生成 + + + + + + + Qt::Orientation::Horizontal + + + + 18 + 20 + + + + + + + + 保存 + + + + + + + Qt::Orientation::Horizontal + + + + 13 + 20 + + + + + + + + 取消 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + 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); +font: 12pt "Microsoft YaHei UI"; +color: rgb(8, 8, 8); + + + 元模型属性 + + + + + + + background-color: rgb(165, 165, 165); +font: 12pt "Microsoft YaHei UI"; +color: rgb(8, 8, 8); + + + 工程模型属性 + + + + + + + + + + + + + + 0 + 20 + + + + background-color: rgb(200, 200, 200); + + + + + + + + + + + diff --git a/ui/renameModel.ui b/ui/renameModel.ui new file mode 100644 index 0000000..be86ca7 --- /dev/null +++ b/ui/renameModel.ui @@ -0,0 +1,177 @@ + + + renameModel + + + + 0 + 0 + 319 + 129 + + + + + 12 + + + + Dialog + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 6 + + + + + + 16777215 + 20 + + + + + 12 + + + + background-color: rgb(205, 205, 205); +color: rgb(10, 10, 10); + + + 重命名 + + + + + + + Qt::Orientation::Horizontal + + + + 64 + 20 + + + + + + + + + + 名称: + + + + + + + + + + 提示: + + + + + + + + + + + + + + + + Qt::Orientation::Horizontal + + + + 63 + 20 + + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + 确定 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + 取消 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + +