project model generate version v0.5

This commit is contained in:
baiYue 2025-03-04 09:44:03 +08:00
parent 42c02f6e42
commit e18ff1a59a
13 changed files with 1998 additions and 32 deletions

View File

@ -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
)
#

View File

@ -6,6 +6,50 @@
#include <QUuid>
#include <QJsonObject>
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<int,attributeGroup> AttributeGroup() const {return _attributeGroup;}
QMap<int,dataType> DataType() const {return _dataType;}
QMap<int,attribute> Attribute() const {return _attribute;}
QMap<int,modelAttribute> ModelAttribute() const {return _modelAttribute;}
QMap<int,modelConnectivity> 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<QString,QJsonObject> getCheckStateFromManager(const QString& sProject); //获取当前工程模型所有属性的选择状态 <属性名,选择状态>
bool createDynamicTable(const QString&, const QStringList&);
private:
QMap<int,attributeGroup> _attributeGroup; //属性组的组
QMap<int,dataType> _dataType; //数据类型组
QMap<int,attribute> _attribute; //属性组
QMap<int,modelAttribute> _modelAttribute; //元模组
QMap<int,modelConnectivity> _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

View File

@ -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)
/**

View File

@ -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()<<prodb.lastError();
}
}*/
void DataBase::updateId()
{
if(db.open())
@ -791,10 +819,12 @@ void DataBase::readXML()
QXmlStreamAttributes attributes = m_pReader->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()<<qry.lastError().text();
}
else
{
while (qry.next())
{
int id = qry.value(0).toInt();
QString group = qry.value(1).toString();
QString groupName = qry.value(2).toString();
if(!_attributeGroup.contains(id))
{
attributeGroup ag;
ag.id = id;
ag.group = group;
ag.groupName = groupName;
_attributeGroup.insert(id,ag);
}
}
}
qry.finish();
return success;
}
return false;
}
bool DataBase::getDataType()
{
if(db.open())
{
QSqlQuery qry(db);
bool success = qry.exec("SELECT * FROM data_type");
if (!success) {
qDebug()<<qry.lastError().text();
}
else
{
while (qry.next())
{
int id = qry.value(0).toInt();
QString dt = qry.value(1).toString();
QString dbt = qry.value(2).toString();
if(!_dataType.contains(id))
{
dataType type;
type.id = id;
type.dataType = dt;
type.databaseType = dbt;
_dataType.insert(id,type);
}
}
}
qry.finish();
return success;
}
return false;
}
bool DataBase::getAttribute()
{
if(db.open())
{
QSqlQuery qry(db);
bool success = qry.exec("SELECT * FROM attribute");
if (!success) {
qDebug()<<qry.lastError().text();
}
else
{
while (qry.next())
{
int id = qry.value(0).toInt();
QString att = qry.value(1).toString(); //属性名
QString dt = qry.value(2).toString(); //类型名
int len = qry.value(3).toInt(); //类型长度
int scale = qry.value(4).toInt(); //类型精度
QString dv = qry.value(5).toString(); //默认值
QString vr = qry.value(6).toString(); //范围
int ag = qry.value(7).toInt(); //属性组
int inn = qry.value(8).toInt(); //非空
int ipk = qry.value(9).toInt(); //是否主键
if(!_dataType.contains(id))
{
attribute attribute;
attribute.id = id;
attribute.attribute = att;
attribute.dataType = dt;
attribute.lengthPrecision = len;
attribute.scale = scale;
attribute.defaultValue = dv;
attribute.valueRange = vr;
attribute.attributeGroup = ag;
attribute.isNotNull = inn;
attribute.isPrimaryKey = ipk;
_attribute.insert(id,attribute);
}
}
}
qry.finish();
return success;
}
return false;
}
bool DataBase::getModelAttribute()
{
if(db.open())
{
QSqlQuery qry(db);
bool success = qry.exec("SELECT * FROM model_attribute");
if (!success) {
qDebug()<<qry.lastError().text();
}
else
{
while (qry.next())
{
int id = qry.value(0).toInt();
QString mt = qry.value(1).toString(); //模型名
int ai = qry.value(2).toInt(); //属性id
if(!_modelAttribute.contains(id))
{
modelAttribute model;
model.id = id;
model.modelType = mt;
model.attributeId = ai;
_modelAttribute.insert(id,model);
}
}
}
qry.finish();
return success;
}
return false;
}
bool DataBase::getModelConnectivity()
{
if(db.open())
{
QSqlQuery qry(db);
bool success = qry.exec("SELECT * FROM model_connectivity");
if (!success) {
qDebug()<<qry.lastError().text();
}
else
{
while (qry.next())
{
int id = qry.value(0).toInt();
QString fm = qry.value(1).toString(); //from
QString tm = qry.value(2).toString(); //to
int con = qry.value(3).toInt(); //是否可联
if(!_modelConnectivity.contains(id))
{
modelConnectivity connect;
connect.id = id;
connect.fromModel = fm;
connect.toModel = tm;
connect.connectivity = con;
_modelConnectivity.insert(id,connect);
}
}
}
qry.finish();
return success;
}
return false;
}
//=================================工程模===========================================//
bool DataBase::createProjectManager()
{
if(db.open())
{
QSqlQuery qry(db);
//qry.exec("CREATE SEQUENCE IF NOT EXISTS project_manager_id_seq;");
//qry.finish();
//id integer NOT NULL DEFAULT nextval('project_manager_id_seq'::regclass) PRIMARY KEY,
QString createTableSQL = R"(
CREATE TABLE IF NOT EXISTS project_manager (
id SERIAL NOT NULL PRIMARY KEY,
name VARCHAR(64) NOT NULL,
tag VARCHAR(64) NOT NULL,
meta_model VARCHAR(64) NOT NULL,
group_name VARCHAR(64) NOT NULL,
link_type integer NOT NULL DEFAULT 0,
check_state JSONB NOT NULL DEFAULT '{}'::jsonb,
)
)";
if (!qry.exec(createTableSQL)) {
qDebug() << "Error creating table:" << qry.lastError().text();
} else {
qDebug() << "Table 'project_manager' created successfully!";
return true;
}
}
return false;
}
bool DataBase::insertProjectManager(const QString& name,const QString& tag,const QString& metaModel,const QString& groupName,int linkType,QJsonObject checkState)
{
if(db.open())
{
QSqlQuery qry(db);
QJsonDocument checkDoc(checkState);
QString strCheck = checkDoc.toJson(QJsonDocument::Compact);
qry.prepare("INSERT INTO project_manager(name, tag, meta_model, group_name, linkType, check_state) VALUES (?, ?, ?, ?, ?, ?)");
qry.bindValue(0,name);
qry.bindValue(1,tag);
qry.bindValue(2,metaModel);
qry.bindValue(3,groupName);
qry.bindValue(4,linkType);
qry.bindValue(5,strCheck);
bool res = qry.exec();
QString str = qry.lastQuery();
if(!res)
{
qDebug()<<str<<"\n"<<qry.lastError().text();
}
qry.clear();
return res;
}
return false;
}
bool DataBase::getProjectManager()
{
}
QMap<QString,QJsonObject> DataBase::getCheckStateFromManager(const QString& sProject)
{
QMap<QString,QJsonObject> 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()<<str<<"\n"<<qry.lastError().text();
qry.clear();
return map;
}
else
{
while (qry.next())
{
QString group = qry.value(0).toString();
QString state = qry.value(1).toString();
QJsonObject jsonObj = QstringToJson(state);
qry.clear();
map.insert(group,jsonObj);
}
return map;
}
}
else
return map;
}
bool DataBase::createDynamicTable(const QString &tableName, const QStringList &fields)
{
if(db.open())
{
QString createTableSQL = "CREATE TABLE IF NOT EXISTS " + tableName + " (";
for (const QString &field : fields) {
createTableSQL += field + ", ";
}
// Remove the last comma and space
createTableSQL.chop(2);
createTableSQL += ")";
QSqlQuery query;
bool res = query.exec();
if (!res) {
qDebug() << "Error creating dynamic table:" << query.lastError().text();
} else {
qDebug() << "Dynamic table created successfully!";
}
return res;
}
return false;
}

View File

@ -18,6 +18,7 @@ class DesignerScene;
class DiagramCavas;
class ElectricElementsBox;
class LoadPageDlg;
class projectModelDlg;
class CMainWindow : public QMainWindow
{
@ -41,6 +42,7 @@ private slots:
void onAction_zoomFit();
void onAction_createGroup();
void onAction_destroyGroup();
void onAction_editProject();
void onSignal_addItem(QGraphicsItem*);
void onSignal_deleteItem();
void onSignal_loadPage();
@ -66,5 +68,6 @@ private:
ElectricElementsBox* m_pElectricElementsBox;
GraphicElementsPanel* m_pGraphicElementsPanel;
LoadPageDlg* m_pLoadPageDlg;
projectModelDlg* m_pProjectModelDlg;
};
#endif // MAINWINDOW_H

74
include/projectModelDlg.h Normal file
View File

@ -0,0 +1,74 @@
#ifndef PROJECTMODELDLG_H
#define PROJECTMODELDLG_H
#include <QDialog>
#include <QStandardItemModel>
#include <QItemSelection>
QT_BEGIN_NAMESPACE
namespace Ui { class projectModelDlg; }
QT_END_NAMESPACE
struct PropertyPage //属性列表信息
{
QStandardItemModel* pBase; //基础属性
QStandardItemModel* pSelect; //已选择属性
QMap<QString,bool> mCheckState; //属性选择状态
};
typedef QMap<QString,PropertyPage> MapProperty; //str为属性名model1基础属性model2已选择属性
struct PropertyModel //工程模
{
MapProperty mapProperty;
int nType; //工程模类型,选择图标后确定
};
typedef QMap<QString,PropertyModel> MapProject; //str为工程名property为属性集
typedef QMap<QString,MapProject> 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

36
include/renameModel.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef RENAMEMODEL_H
#define RENAMEMODEL_H
#include <QDialog>
#include <QStandardItemModel>
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

View File

@ -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<QString,GraphicsItemType> 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)

667
source/projectModelDlg.cpp Normal file
View File

@ -0,0 +1,667 @@
#include <QMessageBox>
#include <QJsonArray>
#include "projectModelDlg.h"
#include "renameModel.h"
#include "dataBase.h"
#include "ui_projectModelDlg.h"
#include "global.h"
const QSet<QString> 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<<QString("base")<<QString("seperation");
QMap<QString,QJsonObject> mapCheckState = DataBase::GetInstance()->getCheckStateFromManager(sProject); //获取选择状态
if(mapCheckState.isEmpty()) //无返回值,是新建目标
{
for(auto &property:lstProperty)
{
//todo:读取属性信息
QStringList lstName = getAttributeList(sMeta,property);
//lstName<<QString("apple")<<QString("banana")<<QString("orange");
PropertyPage struProperty;
struProperty.pBase = new QStandardItemModel(this);
struProperty.pSelect = new QStandardItemModel(this);
//propertyItem->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<<QString("metaModel1")<<QString("metaModel2");
for(auto &model:lstModel)
{
MapProject mp;
QStringList lstProject;
lstProject<<QString::fromWCharArray(L"新建"); //每个类别都有未命名工程
QStandardItem* modelItem = new QStandardItem(model); //总览view类型
for(auto &proj:lstProject)
{
QStandardItem* propertyItem = new QStandardItem(proj);
modelItem->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<QStandardItem*> 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<QStandardItemModel*>(ui->listView_icon->model());
if(model)
{
QStandardItem* pItem = model->itemFromIndex(index);
int id = pItem->data(Qt::UserRole).toInt();
}
}
//=============================================================================
QStringList projectModelDlg::getModelList() const
{
QMap<int,modelAttribute> modelMap = DataBase::GetInstance()->ModelAttribute();
QSet<QString> modelSet;
for(auto &model:modelMap)
{
modelSet.insert(model.modelType);
}
return QStringList(modelSet.values());
}
QStringList projectModelDlg::getGroupList(const QString& sM) const
{
QMap<int,attributeGroup> groupMap = DataBase::GetInstance()->AttributeGroup();
QMap<int,modelAttribute> modelMap = DataBase::GetInstance()->ModelAttribute();
QMap<int,attribute> attMap = DataBase::GetInstance()->Attribute();
QSet<int> 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<int,attributeGroup> groupMap = DataBase::GetInstance()->AttributeGroup();
QMap<int,modelAttribute> modelMap = DataBase::GetInstance()->ModelAttribute();
QMap<int,attribute> attMap = DataBase::GetInstance()->Attribute();
int groupId = -1;
for(auto &group:groupMap)
{
if(group.group == sG) //根据group获取对应Id
{
groupId = group.id;
break;
}
}
QSet<int> 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<int,attribute> 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<QStandardItemModel*>(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;
}
}
}
}

105
source/renameModel.cpp Normal file
View File

@ -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<projectModelDlg*>(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();
}

View File

@ -38,9 +38,15 @@
<string>模式</string>
</property>
</widget>
<widget class="QMenu" name="menuProject">
<property name="title">
<string>工程模</string>
</property>
</widget>
<addaction name="menuFile"/>
<addaction name="menuView"/>
<addaction name="menuMode"/>
<addaction name="menuProject"/>
</widget>
<widget class="QToolBar" name="toolBar">
<property name="windowTitle">

469
ui/projectModelDlg.ui Normal file
View File

@ -0,0 +1,469 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>projectModelDlg</class>
<widget class="QDialog" name="projectModelDlg">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1021</width>
<height>669</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QWidget" name="widget" native="true">
<property name="styleSheet">
<string notr="true">QWidget#widget{
background-color: rgb(232, 232, 232);
}</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,3">
<item>
<widget class="QWidget" name="widget_left" native="true">
<property name="styleSheet">
<string notr="true">background-color: rgb(200, 200, 200);</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<widget class="QWidget" name="widget_2" native="true">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_4">
<property name="styleSheet">
<string notr="true">background-color: rgb(165, 165, 165);
font: 12pt &quot;Microsoft YaHei UI&quot;;
color: rgb(8, 8, 8);</string>
</property>
<property name="text">
<string>模型索引</string>
</property>
</widget>
</item>
<item>
<widget class="QTreeView" name="treeView_model">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
<widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="page">
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QWidget" name="widget_3" native="true">
<layout class="QVBoxLayout" name="verticalLayout_5">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_7">
<property name="styleSheet">
<string notr="true">background-color: rgb(165, 165, 165);
font: 12pt &quot;Microsoft YaHei UI&quot;;
color: rgb(8, 8, 8);</string>
</property>
<property name="text">
<string>关联图元</string>
</property>
</widget>
</item>
<item>
<widget class="QListView" name="listView_icon"/>
</item>
<item>
<widget class="QLabel" name="label_linkState">
<property name="styleSheet">
<string notr="true">font: 12pt &quot;Microsoft YaHei UI&quot;;
color: rgb(8, 8, 8);</string>
</property>
<property name="text">
<string>关联状态:</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="page_2"/>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_right" native="true">
<property name="styleSheet">
<string notr="true">QWidget#widget_right{
background-color: rgb(200, 200, 200);
}
QWidget{
color: rgb(3, 3, 3);
font: 12pt &quot;Microsoft YaHei UI&quot;;
}</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="2" rowspan="4">
<widget class="QTreeView" name="treeView_sub">
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="btn_apply">
<property name="text">
<string>&gt;&gt;</string>
</property>
</widget>
</item>
<item row="5" column="1">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>156</height>
</size>
</property>
</spacer>
</item>
<item row="6" column="0" colspan="3">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>28</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btn_generate">
<property name="text">
<string>生成</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>18</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btn_save">
<property name="text">
<string>保存</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>13</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btn_cancel">
<property name="text">
<string>取消</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="2" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>156</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0" rowspan="4">
<widget class="QTreeView" name="treeView_base">
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
<item row="4" column="1">
<widget class="QPushButton" name="btn_revoke">
<property name="text">
<string>&lt;&lt;</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="3">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<family>Microsoft YaHei UI</family>
<pointsize>12</pointsize>
<italic>false</italic>
<bold>false</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="text">
<string>元模:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cb_baseModel"/>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="font">
<font>
<family>Microsoft YaHei UI</family>
<pointsize>12</pointsize>
<italic>false</italic>
<bold>false</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="text">
<string>工程模:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cb_projectModel">
<property name="editable">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<family>Microsoft YaHei UI</family>
<pointsize>12</pointsize>
<italic>false</italic>
<bold>false</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="text">
<string>属性类别:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cb_property"/>
</item>
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="styleSheet">
<string notr="true">background-color: rgb(165, 165, 165);
font: 12pt &quot;Microsoft YaHei UI&quot;;
color: rgb(8, 8, 8);</string>
</property>
<property name="text">
<string>元模型属性</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_6">
<property name="styleSheet">
<string notr="true">background-color: rgb(165, 165, 165);
font: 12pt &quot;Microsoft YaHei UI&quot;;
color: rgb(8, 8, 8);</string>
</property>
<property name="text">
<string>工程模型属性</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QLabel" name="label_info">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(200, 200, 200);</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

177
ui/renameModel.ui Normal file
View File

@ -0,0 +1,177 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>renameModel</class>
<widget class="QDialog" name="renameModel">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>319</width>
<height>129</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="horizontalSpacing">
<number>0</number>
</property>
<property name="verticalSpacing">
<number>6</number>
</property>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="label_title">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>20</height>
</size>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(205, 205, 205);
color: rgb(10, 10, 10);</string>
</property>
<property name="text">
<string>重命名</string>
</property>
</widget>
</item>
<item row="1" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>64</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>名称:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit_name"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>提示:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_info">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="2">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>63</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0" colspan="3">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btn_ok">
<property name="text">
<string>确定</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btn_cancel">
<property name="text">
<string>取消</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>