add alter dynamic table/fix bugs

This commit is contained in:
baiYue 2025-07-23 17:27:35 +08:00
parent ece2debbad
commit 4f3c865126
12 changed files with 179 additions and 97 deletions

View File

@ -465,6 +465,7 @@ class GraphicsBaseModelItem : public GraphicsBaseItem //基模item
public:
GraphicsBaseModelItem(QGraphicsItem *parent);
virtual ~GraphicsBaseModelItem();
virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override;
protected:
virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange, const QVariant&);
};

View File

@ -9,6 +9,7 @@ QT_END_NAMESPACE
class GraphicsBaseModelItem;
class BaseModelProperty;
class FixedPortsModel;
class ProjectModelSetting : public QDialog
{
@ -21,22 +22,26 @@ public:
void loadPicture();
void setSelectedItems(QStringList);
void showDlg(GraphicsBaseModelItem*);
void loadProject(const QString& sMeta);
protected:
void setController(FixedPortsModel* p){_controller = p;}
//void loadProject(const QString& sMeta);
public slots:
void onOkClicked();
void onCancelClicked();
void onSaveAsClicked();
//void onSaveAsClicked();
void onSelectClicked(); //选择图片
void onAddClicked(); //添加属性
void onDecreaseClicked(); //减少属性
void onSaveClicked();
public slots:
void onSaveAsFinished(); //另存输入完毕
//void onSaveAsFinished(); //另存输入完毕
void onCurrentTextChanged(const QString&);
private:
void showTestPic(QByteArray);
void loadModel(const QString&);
private:
Ui::projectModelSetting *ui;
FixedPortsModel* _controller;
BaseModelProperty* _curItemData; //当前操作对象的属性
QString _curPath;
};

View File

@ -77,11 +77,12 @@ void ElectricBaseModelLineItem::paint(QPainter* painter, const QStyleOptionGraph
{
if (option->state & QStyle::State_Selected)
{
painter->setPen(Qt::red);
painter->setPen(QColor(135,206,235,180));
}
else
{
painter->setPen(m_pen);
GraphicsBaseModelItem::paint(painter,option,widget);
}
painter->setBrush(m_brush);

View File

@ -63,39 +63,11 @@ void ElectricBaseModelSvgItem::paint(QPainter* painter, const QStyleOptionGraphi
if (option->state & QStyle::State_Selected) //是选中状态,绘制选中框
{
renderSelectBackground(painter);
/*int nPenWidth = 1;
painter->setPen(QPen(QColor(135,206,235,180))); //蓝色的外框
painter->setBrush(QBrush(QColor(135,206,235,180)));
double dx = m_boundingRect_selected.x();
double dy = m_boundingRect_selected.y();
double dWidth = m_boundingRect_selected.width();
double dHeight = m_boundingRect_selected.height();
//画弧线0度是3点钟方向
if(dWidth > dHeight)
{
painter->drawRect(m_boundingRect_selected);
painter->drawChord(dx-dHeight*0.5,dy,dHeight,dHeight,90*16,180*16);
painter->drawChord(dx+dWidth-dHeight*0.5,dy,dHeight,dHeight,(-90)*16,180*16);
}
else if(dWidth < dHeight)
{
painter->drawRect(m_boundingRect_selected);
painter->drawChord(dx,dy-dWidth*0.5,dWidth,dWidth,0*16,180*16);
painter->drawChord(dx,dy+dHeight-dWidth*0.5,dWidth,dWidth,180*16,180*16);
//painter->drawChord(dx+dWidth-dHeight*0.5,dy,dHeight,dHeight,(-90)*16,180*16);
}
else
{
painter->drawEllipse(QPointF(dx+dWidth*0.5,dy+dHeight*0.5),dHeight*0.5,dHeight*0.5);
}*/
painter->drawText(QPointF(0,0),"yes");
}
else
painter->drawText(QPointF(0,0),"no");
{
GraphicsBaseModelItem::paint(painter,option,widget);
}
}
void ElectricBaseModelSvgItem::loadSvg(const QByteArray& data)

View File

@ -1118,6 +1118,7 @@ void FixedPortsModel::showProjectModelSettingDlg(GraphicsBaseModelItem* srcItem)
if(m_proModelSettingDlg == nullptr)
{
m_proModelSettingDlg = new ProjectModelSetting(_widget);
m_proModelSettingDlg->setController(this);
}
m_proModelSettingDlg->showDlg(srcItem);
}
@ -1621,6 +1622,8 @@ void FixedPortsModel::addTestData()
addBayItem(bayId,pBay);
addItemsToBay(lst,pBay);
_scene->addItem(pBay);
QString s = pageName();
int a = 1;
}
QJsonObject FixedPortsModel::turnListToJson(QList<QUuid> lst,QString sInerTag,QString sOutTag)

View File

@ -199,6 +199,16 @@ GraphicsBaseModelItem::~GraphicsBaseModelItem()
}
void GraphicsBaseModelItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
if(getProperty()->modelName().isEmpty())
{
painter->setPen(QColor(255,0,0,80));
painter->setBrush(QColor(255,0,0,80));
painter->drawRoundedRect(m_boundingRect,10,10);
}
}
QVariant GraphicsBaseModelItem::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value)
{
if (change == QGraphicsItem::ItemSelectedHasChanged)

View File

@ -161,7 +161,15 @@ void ItemPropertyDlg::showDlg(modelDataInfo dataInfo,QUuid uuid,GraphicsProjectM
curUuid_ = uuid;
_curModel = dataInfo.modelName;
_curItem = pItem;
QString firstName = groupInfo_.constBegin().key();
onGroupSelected(firstName); //打开默认显示第一个属性组
QString str;
auto btn = dynamic_cast<QPushButton*>(btnGroup_->checkedButton());
if(btn == nullptr){
str = groupInfo_.constBegin().key(); //打开默认显示第一个属性组
}
else{
str = btn->text();
}
onGroupSelected(str);
show();
}

View File

@ -9,15 +9,18 @@
#include "ui_projectModelSetting.h"
#include "baseProperty.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "graphicsDataModel/fixedPortsModel.h"
#include "projectModelManager.h"
#include "tools.h"
#include "global.h"
#include "logger.h"
#include "dataBase.h"
ProjectModelSetting::ProjectModelSetting(QWidget *parent)
: QDialog(parent)
,ui(new Ui::projectModelSetting)
,_curItemData(nullptr)
,_controller(nullptr)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
@ -33,19 +36,19 @@ void ProjectModelSetting::initial()
{
connect(ui->btn_ok,&QPushButton::clicked,this,&ProjectModelSetting::onOkClicked);
connect(ui->btn_cancel,&QPushButton::clicked,this,&ProjectModelSetting::onCancelClicked);
connect(ui->btn_saveAs,&QPushButton::clicked,this,&ProjectModelSetting::onSaveAsClicked);
//connect(ui->btn_saveAs,&QPushButton::clicked,this,&ProjectModelSetting::onSaveAsClicked);
connect(ui->btn_select,&QPushButton::clicked,this,&ProjectModelSetting::onSelectClicked);
connect(ui->btn_apply,&QPushButton::clicked,this,&ProjectModelSetting::onAddClicked);
connect(ui->btn_revoke,&QPushButton::clicked,this,&ProjectModelSetting::onDecreaseClicked);
connect(ui->le_saveAs,&QLineEdit::editingFinished,this,&ProjectModelSetting::onSaveAsFinished);
connect(ui->cb_modelType,&QComboBox::currentTextChanged,this,&ProjectModelSetting::onCurrentTextChanged);
//connect(ui->le_saveAs,&QLineEdit::editingFinished,this,&ProjectModelSetting::onSaveAsFinished);
//connect(ui->cb_modelType,&QComboBox::currentTextChanged,this,&ProjectModelSetting::onCurrentTextChanged);
_curPath = QCoreApplication::applicationDirPath()+"/proModelImage/";
ui->cb_modelType->setPlaceholderText(" ");
QRegularExpression regExp("[a-zA-Z0-9]+");
//ui->cb_modelType->setPlaceholderText(" ");
/*QRegularExpression regExp("[a-zA-Z0-9]+");
QRegularExpressionValidator *validator = new QRegularExpressionValidator(regExp, this);
ui->le_saveAs->setValidator(validator);
ui->le_saveAs->setValidator(validator);*/
}
void ProjectModelSetting::loadPicture()
@ -99,12 +102,19 @@ void ProjectModelSetting::showDlg(GraphicsBaseModelItem* srcNode)
QString sName = pro->name();
QString sMetaModel = pro->metaModelName();
QString sModel = pro->modelName();
if(sModel.isEmpty()) //模型为空直接判断名字()
{
sModel = sMetaModel+"_"+_controller->pageName();
pro->setModelName(sModel);
}
_curItemData = pro;
loadProject(sMetaModel);
//loadProject(sMetaModel);
bool bExist = ProjectModelManager::instance().ifProjectExsit(sModel);
if(bExist){ //使用存在的属性
ui->cb_modelType->setCurrentText(sModel);
//ui->cb_modelType->setCurrentText(sModel);
loadModel(sModel);
}
else{ //新建当前对象的属性
if(pro->getModelProperty().pBase == nullptr && pro->getModelProperty().pSelect == nullptr){
@ -117,25 +127,26 @@ void ProjectModelSetting::showDlg(GraphicsBaseModelItem* srcNode)
ui->treeView_sub->expandAll();
ui->treeView_base->expandAll();
}
ui->le_saveAs->clear();
//ui->le_saveAs->clear();
ui->le_name->setText(sName);
ui->le_base->setText(sMetaModel);
}
loadPicture();
}
void ProjectModelSetting::loadProject(const QString& sMeta)
/*void ProjectModelSetting::loadProject(const QString& sMeta)
{
ui->cb_modelType->blockSignals(true);
ui->cb_modelType->clear();
QStringList lst = ProjectModelManager::instance().getProjectModelLst(sMeta);
ui->cb_modelType->addItems(lst);
ui->cb_modelType->blockSignals(false);
}
}*/
void ProjectModelSetting::onOkClicked()
{
_curItemData->setModelName(ui->cb_modelType->currentText());
//_curItemData->setModelName(ui->cb_modelType->currentText());
onSaveClicked();
hide();
}
@ -144,7 +155,7 @@ void ProjectModelSetting::onCancelClicked()
hide();
}
void ProjectModelSetting::onSaveAsClicked()
/*void ProjectModelSetting::onSaveAsClicked()
{
QString sModelName = ui->le_saveAs->text();
bool bExist = ProjectModelManager::instance().ifProjectExsit(sModelName);
@ -164,7 +175,7 @@ void ProjectModelSetting::onSaveAsClicked()
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"另存成功"));
}
ui->label_info->clear();
}
}*/
void ProjectModelSetting::onSelectClicked()
{
@ -267,7 +278,71 @@ void ProjectModelSetting::onDecreaseClicked()
ui->treeView_base->expandAll();
}
void ProjectModelSetting::onSaveAsFinished()
void ProjectModelSetting::onSaveClicked()
{
if(_curItemData){
QString sMeta = _curItemData->metaModelName();
QString sModelName = _curItemData->modelName();
bool bExist = ProjectModelManager::instance().ifProjectExsit(sModelName);
if(bExist){
QMessageBox msgBox;
msgBox.setText(QString::fromWCharArray(L"提示"));
msgBox.setInformativeText(QString::fromWCharArray(L"模型将被覆盖,是否保存?"));
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();
switch (ret) {
case QMessageBox::Save:
{
PropertyModel pro = _curItemData->getModelProperty().deepCopy();
ProjectModelManager::instance().getData()[_curItemData->metaModelName()][sModelName] = pro;
ProjectModelManager::instance().updateSetting(_curItemData->metaModelName(),sModelName);
QMap<QString,QJsonObject> mapCheckState = DataBase::GetInstance()->getCheckStateFromManager(sModelName);
QString sRes = ProjectModelManager::instance().modifyProjectModel(sMeta,sModelName,mapCheckState);
if(!sRes.isEmpty())
{
QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改成功"));
}
else
{
QMessageBox::information(NULL, QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"修改失败"));
}
}
break;
case QMessageBox::Cancel:
break;
default:
break;
}
}
else{ //新建的模型拷贝当前内容到全局队列
_curItemData->getModelProperty().modelSetting.modelName = sModelName;
PropertyModel pro = _curItemData->getModelProperty().deepCopy();
ProjectModelManager::instance().getData()[_curItemData->metaModelName()].insert(sModelName,pro);
ProjectModelManager::instance().generate(_curItemData->metaModelName(),sModelName);
ProjectModelManager::instance().updateSetting(_curItemData->metaModelName(),sModelName);
QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存成功"));
}
if(_controller){
QMap<QUuid,GraphicsBaseModelItem*> mapItem = _controller->allBaseItems();
for(auto &item:mapItem)
{
ModelProperty* p = item->getProperty();
BaseModelProperty* pro = dynamic_cast<BaseModelProperty*>(p);
if(pro){
if(pro->metaModelName() == _curItemData->metaModelName()){ //将相同基模item的工程模名称都置为相同(改一个全变)
pro->setModelName(_curItemData->modelName());
}
}
}
}
}
}
/*void ProjectModelSetting::onSaveAsFinished()
{
QString sModelName = ui->le_saveAs->text();
bool bExist = ProjectModelManager::instance().ifProjectExsit(sModelName);
@ -277,7 +352,7 @@ void ProjectModelSetting::onSaveAsFinished()
else{
ui->label_info->setText(QString::fromWCharArray(L"名称可用"));
}
}
}*/
void ProjectModelSetting::onCurrentTextChanged(const QString& text)
{
@ -321,3 +396,22 @@ void ProjectModelSetting::showTestPic(QByteArray arr)
ui->modelImagePreview->clear();
ui->modelImagePreview->setPixmap(pixmap);
}
void ProjectModelSetting::loadModel(const QString& text)
{
if(text.isEmpty())
return;
if(_curItemData)
{
_curItemData->getModelProperty().release();
PropertyModel model = ProjectModelManager::instance().getData()[_curItemData->metaModelName()][text].deepCopy();
_curItemData->setModelProperty(model);
ui->treeView_base->setModel(_curItemData->getModelProperty().pBase);
ui->treeView_sub->setModel(_curItemData->getModelProperty().pSelect);
ui->treeView_sub->expandAll();
ui->treeView_base->expandAll();
loadPicture();
if(!_curItemData->getModelProperty().modelSetting.mapSvg.isEmpty())
setSelectedItems(_curItemData->getModelProperty().modelSetting.mapSvg.keys());
}
}

View File

@ -42,7 +42,10 @@ QWidget* PropertyContentDlg::createEditor(propertyStateInfo pro)
if(pro.type.contains("SMALLINT"))
{
QSpinBox* spin = new QSpinBox(this);
spin->setRange(-32768, 32767);
if(pro.lengthPrecision > 0)
spin->setRange(-pro.lengthPrecision,pro.lengthPrecision);
else
spin->setRange(-32768, 32767);
pWidget = spin;
}
else if(pro.type.contains("INTEGER"))
@ -50,6 +53,9 @@ QWidget* PropertyContentDlg::createEditor(propertyStateInfo pro)
QSpinBox* spin = new QSpinBox(this);
if(pro.lengthPrecision > 0)
spin->setRange(-pro.lengthPrecision,pro.lengthPrecision);
else
spin->setRange(-32768,32767);
pWidget = spin;
}
else if(pro.type.contains("BIGINT"))
@ -63,15 +69,21 @@ QWidget* PropertyContentDlg::createEditor(propertyStateInfo pro)
else if(pro.type.contains("REAL"))
{
QDoubleSpinBox* dbSpin = new QDoubleSpinBox(this);
dbSpin->setDecimals(6);
dbSpin->setDecimals(4);
if(pro.lengthPrecision > 0)
dbSpin->setRange(-pro.lengthPrecision,pro.lengthPrecision);
else
dbSpin->setRange(-9999999,9999999);
pWidget = dbSpin;
}
else if(pro.type.contains("DOUBLE PRECISION"))
{
QDoubleSpinBox* dbSpin = new QDoubleSpinBox(this);
dbSpin->setDecimals(15);
dbSpin->setDecimals(8);
if(pro.lengthPrecision > 0)
dbSpin->setRange(-pro.lengthPrecision,pro.lengthPrecision);
else
dbSpin->setRange(-9999999,9999999);
pWidget = dbSpin;
}
else if(pro.type.contains("NUMERIC") || pro.type.contains("DECIMAL"))

View File

@ -100,7 +100,7 @@
<property name="title">
<string>基本信息</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,0,1,0,1">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,0,0,1">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
@ -115,6 +115,19 @@
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<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_3">
<property name="text">
@ -129,16 +142,6 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>当前工程模:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cb_modelType"/>
</item>
</layout>
</widget>
</item>
@ -368,33 +371,6 @@ color: rgb(8, 8, 8);</string>
<property name="bottomMargin">
<number>6</number>
</property>
<item>
<widget class="QPushButton" name="btn_saveAs">
<property name="text">
<string>工程模另存为</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="le_saveAs">
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_info">
<property name="minimumSize">
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">

View File

@ -41,7 +41,7 @@ public:
signals:
void modelChange(); //模型改变信号
private:
int createPropertyTable(const QString& sMeta,const QString& sProject,const QString& sGroup,QList<QStandardItem*> lstSelect,QList<QStandardItem*> lstBase,int nLinkType,bool isPublic = false); //创建属性组表并插入记录到管理表(工程名,当前项迭代器,关联图元类型)
int createPropertyTable(const QString& sMeta,const QString& sProject,const QString& sGroup,QList<QStandardItem*> lstSelect,QList<QStandardItem*> lstBase,int nLinkType,bool isPublic); //创建属性组表并插入记录到管理表(工程名,当前项迭代器,关联图元类型)
QJsonObject getSelectedState(QList<QStandardItem*> select,QList<QStandardItem*> base); //返回json格式的选中状态
QString getItemDataType(const QStandardItem* pItem); //返回数据类型
projectModelSetting getModelSetting(const QString& sMeta,const QString& sProject); //获取指定工程模的设定

View File

@ -626,7 +626,7 @@ QString ProjectModelManager::modifyProjectModel(const QString& sMeta,const QStri
}
}
else{ //非空且库模型中不存在,新增
bool res = createPropertyTable(sMeta,sProject,iter.key(),lstSelected,lstBase,iter->isPublic);
bool res = createPropertyTable(sMeta,sProject,iter.key(),lstSelected,lstBase,0,iter->isPublic);
if(res)
{
sRes = QString::fromWCharArray(L"修改模型成功");