diff --git a/CMakeLists.txt b/CMakeLists.txt index 9993783..f0f58cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -191,8 +191,8 @@ add_subdirectory(diagramUtils) add_subdirectory(diagramCommunication) add_subdirectory(pluginManager) -target_link_libraries(DiagramDesigner PRIVATE PropertyEditor) -target_link_libraries(DiagramDesigner PRIVATE diagramCavas diagramUtils diagramCommunication pluginManager) +target_link_libraries(DiagramDesigner PUBLIC PropertyEditor) +target_link_libraries(DiagramDesigner PUBLIC diagramCavas diagramUtils diagramCommunication pluginManager) file(COPY setting.xml DESTINATION "${CMAKE_BINARY_DIR}/${dd_PlatformDir}/bin") diff --git a/PropertyEditor/source/include/QDetailsView.h b/PropertyEditor/source/include/QDetailsView.h index 5118634..a86a0fe 100644 --- a/PropertyEditor/source/include/QDetailsView.h +++ b/PropertyEditor/source/include/QDetailsView.h @@ -11,10 +11,10 @@ public: explicit QDetailsView(QWidget* parent = nullptr); QQuickDetailsView* getQuickDetailsView() const; void setObject(QObject* inObject); - QObject* getObject() const; + QObject* getObject() const; private: QQuickWidget* mQuickWidget; - QQuickDetailsView* mQuickDetailsView; + QQuickDetailsView* mQuickDetailsView; }; #endif // QDetailsView_h__ diff --git a/PropertyEditor/source/src/QDetailsView.cpp b/PropertyEditor/source/src/QDetailsView.cpp index ea68b04..fbc68a2 100644 --- a/PropertyEditor/source/src/QDetailsView.cpp +++ b/PropertyEditor/source/src/QDetailsView.cpp @@ -4,63 +4,64 @@ #include #include #include +#include #include "QQuickDetailsViewMananger.h" QDetailsView::QDetailsView(QWidget* parent) - : QWidget(parent) + : QWidget(parent) , mQuickWidget(nullptr) , mQuickDetailsView(nullptr) { - setMinimumSize(200, 200); + setMinimumSize(200, 200); - if (!QQuickDetailsViewManager::Get()->isInitialized()) { - QQuickDetailsViewManager::Get()->initialize(); - } + if (!QQuickDetailsViewManager::Get()->isInitialized()) { + QQuickDetailsViewManager::Get()->initialize(); + } - mQuickWidget = new QQuickWidget(this); - mQuickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); + mQuickWidget = new QQuickWidget(this); + mQuickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); - const QString qmlContent = R"( - import QtQuick - import QtQuick.Controls - import QtQuick.DetailsView + const QString qmlContent = R"( + import QtQuick + import QtQuick.Controls + import QtQuick.DetailsView DetailsView { - id: detailsView + id: detailsView anchors.fill: parent - boundsBehavior: Flickable.OvershootBounds - ScrollBar.vertical: ScrollBar { - parent: detailsView.parent - width : 10 - anchors.top: detailsView.top - anchors.right: detailsView.right - anchors.bottom: detailsView.bottom - } + boundsBehavior: Flickable.OvershootBounds + ScrollBar.vertical: ScrollBar { + parent: detailsView.parent + width : 10 + anchors.top: detailsView.top + anchors.right: detailsView.right + anchors.bottom: detailsView.bottom + } } )"; - QQmlComponent component(mQuickWidget->engine()); - component.setData(qmlContent.toUtf8(), QUrl("")); - QObject* rootObject = component.create(); - if (!component.errors().isEmpty()) { - qDebug() << component.errorString(); - } - if (rootObject) { - mQuickWidget->setSource(QUrl()); - mQuickWidget->engine()->setObjectOwnership(rootObject, QQmlEngine::CppOwnership); + QQmlComponent component(mQuickWidget->engine()); + component.setData(qmlContent.toUtf8(), QUrl("")); + QObject* rootObject = component.create(); + if (!component.errors().isEmpty()) { + qDebug() << component.errorString(); + } + if (rootObject) { + mQuickWidget->setSource(QUrl()); + mQuickWidget->engine()->setObjectOwnership(rootObject, QQmlEngine::CppOwnership); - QQuickItem* rootItem = qobject_cast(rootObject); - if (rootItem) { - mQuickWidget->setContent(QUrl(), &component, rootItem); - mQuickDetailsView = qobject_cast(rootItem); - } - } + QQuickItem* rootItem = qobject_cast(rootObject); + if (rootItem) { + mQuickWidget->setContent(QUrl(), &component, rootItem); + mQuickDetailsView = qobject_cast(rootItem); + } + } - QVBoxLayout* layout = new QVBoxLayout(this); - layout->setContentsMargins(0, 0, 0, 0); - layout->addWidget(mQuickWidget); - setLayout(layout); + QVBoxLayout* layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(mQuickWidget); + setLayout(layout); } QQuickDetailsView* QDetailsView::getQuickDetailsView() const @@ -70,10 +71,21 @@ QQuickDetailsView* QDetailsView::getQuickDetailsView() const void QDetailsView::setObject(QObject* inObject) { - QQuickItem* rootObject = mQuickWidget->rootObject(); - if (rootObject) { - rootObject->setProperty("Object", QVariant::fromValue(inObject)); - } + if (!mQuickWidget) return; + + QQuickItem* rootObject = mQuickWidget->rootObject(); + if (!rootObject) return; + + // ✅ 安全处理nullptr + if (!inObject) { + // 设置一个表示"空"的特殊值 + QVariant emptyVar = QVariant::fromValue(nullptr); + rootObject->setProperty("Object", emptyVar); + return; + } + + // 设置普通对象 + rootObject->setProperty("Object", QVariant::fromValue(inObject)); } QObject* QDetailsView::getObject() const diff --git a/PropertyEditor/source/src/QPropertyHandle.cpp b/PropertyEditor/source/src/QPropertyHandle.cpp index ac8e165..baac139 100644 --- a/PropertyEditor/source/src/QPropertyHandle.cpp +++ b/PropertyEditor/source/src/QPropertyHandle.cpp @@ -65,6 +65,8 @@ void QPropertyHandle::resloveMetaData() QPropertyHandle* QPropertyHandle::Find(const QObject* inParent, const QString& inPropertyPath) { + if(!inParent) + return nullptr; for (QObject* child : inParent->children()) { QPropertyHandle* handler = qobject_cast(child); if (handler && handler->getPropertyPath() == inPropertyPath) { @@ -90,6 +92,8 @@ QPropertyHandle* QPropertyHandle::FindOrCreate(QObject* inParent, QMetaType inTy QPropertyHandle* QPropertyHandle::FindOrCreate(QObject* inObject) { + if(!inObject) + return nullptr; QPropertyHandle* handle = Find(inObject, ""); if (handle) return handle; diff --git a/common/core_model/types.h b/common/core_model/types.h index 1466f8c..ef8c672 100644 --- a/common/core_model/types.h +++ b/common/core_model/types.h @@ -93,7 +93,9 @@ enum DiagramMode { DM_edit = 0, DM_run, DM_academic, - DM_baseModel + DM_baseModel, + DM_customHMI, + DM_previewHMI }; //端口类型 diff --git a/diagramCavas/CMakeLists.txt b/diagramCavas/CMakeLists.txt index a55d12d..a0344c7 100644 --- a/diagramCavas/CMakeLists.txt +++ b/diagramCavas/CMakeLists.txt @@ -53,8 +53,11 @@ set(DIAGRAMCAVAS_HEADER_FILES include/baseItemPropertyProxy.h include/dataSourceDlg.h include/createHMIdlg.h + include/customHMIGenerateDlg.h include/propertyDialog.h include/eventPropertyEditor.h + include/selectPanel.h + include/customHMIList.h include/graphicsDataModel/baseModel.h include/graphicsDataModel/fixedPortsModel.h include/graphicsItem/graphicsItemGroup.h @@ -197,7 +200,10 @@ set(DIAGRAMCAVAS_SOURCE_FILES source/baseItemPropertyProxy.cpp source/dataSourceDlg.cpp source/createHMIdlg.cpp + source/customHMIGenerateDlg.cpp source/propertyDialog.cpp + source/selectPanel.cpp + source/customHMIList.cpp source/graphicsDataModel/baseModel.cpp source/graphicsDataModel/fixedPortsModel.cpp source/graphicsItem/graphicsItemGroup.cpp @@ -285,24 +291,15 @@ set(UI_FILES ui/bayMeasureDlg.ui ui/dataSourceDlg.ui ui/createHMIdlg.ui + ui/customHMIGenerateDlg.ui ) -if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) - qt_add_library(diagramCavas SHARED - MANUAL_FINALIZATION - ${DIAGRAMCAVAS_HEADER_FILES} - ${DIAGRAMCAVAS_SOURCE_FILES} - ${UI_FILES} - ../resource/DiagramDesigner.qrc - ) -else() - add_library(diagramCavas SHARED - ${DIAGRAMCAVAS_HEADER_FILES} - ${DIAGRAMCAVAS_SOURCE_FILES} - ${UI_FILES} - ../resource/DiagramDesigner.qrc - ) -endif() +add_library(diagramCavas SHARED + ${DIAGRAMCAVAS_HEADER_FILES} + ${DIAGRAMCAVAS_SOURCE_FILES} + ${UI_FILES} + ../resource/DiagramDesigner.qrc +) target_link_libraries(diagramCavas PUBLIC Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui @@ -319,15 +316,21 @@ option(BUILD_SHARED_LIBS "Build as shared library" ON) target_include_directories(diagramCavas PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) -target_link_libraries(diagramCavas PRIVATE diagramUtils) -target_link_libraries(diagramCavas PRIVATE diagramCommunication) -target_link_libraries(diagramCavas PRIVATE pluginManager) +target_link_libraries(diagramCavas PUBLIC diagramUtils) +target_link_libraries(diagramCavas PUBLIC diagramCommunication) +target_link_libraries(diagramCavas PUBLIC pluginManager) target_link_libraries(diagramCavas PUBLIC PropertyEditor) target_compile_definitions(diagramCavas - PUBLIC - DIAGRAM_DESIGNER_SHARED PRIVATE DIAGRAM_DESIGNER_EXPORTS - #QT_NO_KEYWORDS + PUBLIC + DIAGRAM_DESIGNER_SHARED ) + +set_target_properties(diagramCavas PROPERTIES + PREFIX "" # DLL没有lib前缀 + OUTPUT_NAME "diagramCavas" # DLL的基本名称 + IMPORT_PREFIX "lib" # 导入库有lib前缀 + IMPORT_SUFFIX ".dll.a" # 导入库后缀 + ) diff --git a/diagramCavas/include/createHMIdlg.h b/diagramCavas/include/createHMIdlg.h index 27dd829..d389bef 100644 --- a/diagramCavas/include/createHMIdlg.h +++ b/diagramCavas/include/createHMIdlg.h @@ -18,9 +18,11 @@ public: void showDlg(); signals: void createHMI(QString,QString,int type = 0); //HMI名称,系统图名称,模板类型 + void createCustomHMI(QString,QString,int type = 0); //HMI名称,系统图名称,模板类型 public slots: void onSaveClicked(); void onCancelClicked(); + void onCustomClicked(); private: Ui::createHMIdlg *ui; }; diff --git a/diagramCavas/include/customHMIGenerateDlg.h b/diagramCavas/include/customHMIGenerateDlg.h new file mode 100644 index 0000000..4cc9ec0 --- /dev/null +++ b/diagramCavas/include/customHMIGenerateDlg.h @@ -0,0 +1,41 @@ +#ifndef CUSTOMHMICREATEDLG_H +#define CUSTOMHMICREATEDLG_H + +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class customHMIGenerateDlg; } +QT_END_NAMESPACE + +class SelectPanel; +class PowerEntity; +class DiagramCavas; +class CustomHMIList; +struct HierarchyItem; + +class CustomHMIGenerateDlg : public QDialog +{ + Q_OBJECT +public: + CustomHMIGenerateDlg(QWidget *parent = nullptr); + ~CustomHMIGenerateDlg(); + + void initial(); + void showDlg(QString,QString,int); //hmi名,系统图名,模板 +signals: + void backCreateHMI(); //退回初始界面信号 +public slots: + void onGenerateClicked(); + void onBackClicked(); + void onPreviewHMI(QList); +private: + Ui::customHMIGenerateDlg *ui; + SelectPanel* _pOperatePanel; //操作界面 + SelectPanel* _pPreviewPanel; //预览界面 + PowerEntity* _pPe; + PowerEntity* _pOe; + DiagramCavas* _pCanvas = nullptr; + CustomHMIList* _pItemList; +}; + +#endif diff --git a/diagramCavas/include/customHMIList.h b/diagramCavas/include/customHMIList.h new file mode 100644 index 0000000..54099e7 --- /dev/null +++ b/diagramCavas/include/customHMIList.h @@ -0,0 +1,44 @@ +#ifndef CUSTOMHMILIST_H +#define CUSTOMHMILIST_H + +/******************自定义创建HMI时的list******************/ +#include +#include +#include +#include "common/core_model/topology.h" + +class CustomHMIList : public QWidget +{ + Q_OBJECT + +public: + CustomHMIList(QWidget *parent = nullptr); + ~CustomHMIList(); + void initial(); + void generatePreview(); //预览自定义HMI +signals: + void previewHMI(QList); //生成监控 +public slots: + void onUpdateItems(QList,bool refresh); //更新当前设备列表 + void onSelectItems(QList); //更新当前选中的设备 + void onMonitorCreated(QList); //创建后的设备列表 + void onItemChanged(QStandardItem *item); //item勾选事件 +private: + void resetSelect(); //重置选中 + void setChildrenCheckState(QStandardItem *parent, Qt::CheckState state); + void traverseSelectStandardItemModel(QStandardItemModel *model,Qt::CheckState); //遍历选中 + void traverseSelectStandardItem(QStandardItem *item, int depth,Qt::CheckState); //遍历选中 + + QList getCheckedItems(QStandardItem* parentItem); //返回checked对象 + QList getTreeViewCheckedItems(QTreeView* treeView); //返回checked对象 + + // 查找间隔节点 + QStandardItem* findBayItem(const QString& bayName); +private: + QTreeView* _tree; + QStandardItemModel* _modelAll; //图中所有item + // 存储间隔名称到树节点的映射,提高查找效率 + QHash m_mapBayItems; +}; + +#endif diff --git a/diagramCavas/include/diagramCavas.h b/diagramCavas/include/diagramCavas.h index c9b1ffe..79d1d80 100644 --- a/diagramCavas/include/diagramCavas.h +++ b/diagramCavas/include/diagramCavas.h @@ -28,7 +28,7 @@ class ExtraPropertyManager; class PluginManager; class PluginItemFactory; -class DIAGRAM_DESIGNER_PUBLIC DiagramCavas : public QMdiArea +class DIAGRAM_DESIGNER_PUBLIC DiagramCavas : public QWidget { Q_OBJECT Q_DECLARE_PRIVATE(DiagramCavas) @@ -64,6 +64,7 @@ signals: void createHMI(QString,QUuid); void updateHMI(QString,QUuid,int,QString); + void clearSelection(); public slots: void onSignal_addDrawingPanel(PowerEntity* p,DiagramMode = DM_edit,QString parent = QString()); //parent:派生运行时的page void onSignal_addGraphicsItem(ModelStateInfo&); diff --git a/diagramCavas/include/diagramCavas_p.h b/diagramCavas/include/diagramCavas_p.h index 57725d8..ff1df0d 100644 --- a/diagramCavas/include/diagramCavas_p.h +++ b/diagramCavas/include/diagramCavas_p.h @@ -23,6 +23,7 @@ class PluginManager; class PluginItemFactory; class QDetailsView; class PropertyDlg; +class CustomHMIGenerateDlg; class DiagramCavasPrivate { @@ -41,11 +42,13 @@ public: StructDataPreviewDlg* _structDataPreviewDlg = nullptr; ExtraPropertyManager* _extraPropertyManager = nullptr; CreateHMIdlg* _createHMIDlg = nullptr; + CustomHMIGenerateDlg* _customCreateHMIDlg = nullptr; QDetailsView* _pPropertyPage = nullptr; PropertyDlg* _pPropertyDlg = nullptr; PluginManager* m_pluginManager = nullptr; PluginItemFactory* m_itemFactory = nullptr; QMap m_pluginInfo; + QMdiArea* m_mdiArea = nullptr; int _curMode = 0; // 私有方法 @@ -62,6 +65,9 @@ public: void onTargetSelected(QObject*); //对象选中事件(属性) void onCreateHMI(); //创建HMI void updateHMIFromDB(); //从数据库中更新HMI信息 + void updateHMIListFormDB(); //从DB更新HMI列表(page中load) + void deletePanel(const QString& name,int nType); + void setCurMode(int); //显示属性相关 void showPropertyDlgImpl(); // 显示属性页 diff --git a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h index c0529bf..350c0a1 100644 --- a/diagramCavas/include/graphicsDataModel/fixedPortsModel.h +++ b/diagramCavas/include/graphicsDataModel/fixedPortsModel.h @@ -38,6 +38,7 @@ class MonitorPanel; class ItemPropertyDlg; class BayMeasureDlg; struct MeasurementInfo; +class SelectPanel; class FixedPortsModel : public BaseModel, public Serializable { @@ -125,6 +126,7 @@ public: void setMonitorDisplaySetting(QMap> map){m_monitorDisplaySetting = map;} QMap>& getMonitorDisplaySetting(){return m_monitorDisplaySetting;} + void previewHMI(SelectPanel* pPreview,QList); //customHMI 生成预览 QList& getHMIimageRef(){return _HMIimageRef;} QList& getHMICustomImageRef(){return _HMICustomImageRef;} int imageRefExist(QString model,QByteArray hash256); @@ -154,9 +156,12 @@ public: void setCavas(QPointer p) {_cavas = p;} //设置所属顶层容器 DiagramCavas* getCavas(); int getCurMode(); //获取当前模式 + void clearCurItems(); //清空当前item + void setPanelMode(int n) {_panelMode = n;} + int getPanelMode(){return _panelMode;} - QMap getHMIItems(){return _nodeItem;} - QMap getProjectBayItems(){return _bayItem;} + QMap& getHMIItems(){return _nodeItem;} + QMap& getProjectBayItems(){return _bayItem;} QMap getGraphicItems(){return _graphicItem;} void setPageState(int n) {_pageState = n;} @@ -215,6 +220,7 @@ private: QList _HMIimageRef; //当前HMI中图片的引用关系 QList _HMICustomImageRef; //当前HMI中图片项的引用 QMap> _mapSelectedRefs; //item属性可见性(属性栏使用) + int _panelMode = 0; //当前panel模式0普通 1预览 public: static bool _dataInitialised; }; diff --git a/diagramCavas/include/graphicsItem/electricBayItem.h b/diagramCavas/include/graphicsItem/electricBayItem.h index 170fda7..6795cfa 100644 --- a/diagramCavas/include/graphicsItem/electricBayItem.h +++ b/diagramCavas/include/graphicsItem/electricBayItem.h @@ -9,12 +9,14 @@ class ElectricBayItem :public GraphicsNonStandardItem Q_OBJECT public: ElectricBayItem(const QRectF &rect, QGraphicsItem *parent = 0); //genNewPort生成新接线点 + ElectricBayItem(const ElectricBayItem&); virtual ~ElectricBayItem(); + virtual ElectricBayItem* clone() const override; void setText(const QString& s); protected: - virtual QPainterPath shape(); - virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*); + virtual QPainterPath shape() override; + virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; private: void updateTextShape(); protected: diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelConnectLineItem.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelConnectLineItem.h index 39ec691..74ca433 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelConnectLineItem.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelConnectLineItem.h @@ -17,7 +17,9 @@ public: }; public: ElectricFunctionModelConnectLineItem(QGraphicsItem *parent = 0); + ElectricFunctionModelConnectLineItem(const ElectricFunctionModelConnectLineItem&); virtual ~ElectricFunctionModelConnectLineItem(); + virtual ElectricFunctionModelConnectLineItem *clone() const override; void setStartPoint(const QPointF& p); void setEndPoint(const QPointF& p); diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelItemText.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelItemText.h index 97b694d..115041a 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelItemText.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelItemText.h @@ -15,7 +15,9 @@ public: Q_PROPERTY(int FontSize READ getFontSize WRITE setFontSize) public: ElectricFunctionModelItemText(QGraphicsItem *parent = 0); + ElectricFunctionModelItemText(const ElectricFunctionModelItemText&); virtual ~ElectricFunctionModelItemText(); + virtual ElectricFunctionModelItemText* clone() const override; void setText(const QString& text); QString getText() {return m_text;} diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelPortItem.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelPortItem.h index 368dce6..5e04fc2 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelPortItem.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelPortItem.h @@ -9,7 +9,9 @@ class ElectricFunctionModelPortItem :public GraphicsFunctionModelItem Q_OBJECT public: ElectricFunctionModelPortItem(QGraphicsItem *parent = 0); + ElectricFunctionModelPortItem(const ElectricFunctionModelPortItem&); virtual ~ElectricFunctionModelPortItem(); + virtual ElectricFunctionModelPortItem* clone() const override; void addPort(); public: diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgGroup.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgGroup.h index c7d204b..c1a094b 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgGroup.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgGroup.h @@ -13,7 +13,9 @@ public: Q_PROPERTY(QFileInfo Image READ getImage_1 WRITE setImage_1) public: ElectricFunctionModelSvgGroup(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgGroup(const ElectricFunctionModelSvgGroup&); virtual ~ElectricFunctionModelSvgGroup(); + virtual ElectricFunctionModelSvgGroup* clone() const override; void resize(int,double, double, const QPointF&) override; void updateCoordinate() override; void move(const QPointF&) override; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgGroupCT.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgGroupCT.h index ea7e085..a73c531 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgGroupCT.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgGroupCT.h @@ -8,7 +8,9 @@ class ElectricFunctionModelSvgGroupCT :public ElectricFunctionModelSvgGroup Q_OBJECT public: ElectricFunctionModelSvgGroupCT(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgGroupCT(const ElectricFunctionModelSvgGroupCT&); virtual ~ElectricFunctionModelSvgGroupCT(); + virtual ElectricFunctionModelSvgGroupCT* clone() const override; virtual void setupFinish(QVariant) override; virtual void updateItem() override; void setCtType(int n){_nType = n;} diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgGroupPT.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgGroupPT.h index 9c3162f..2797e5c 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgGroupPT.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgGroupPT.h @@ -8,7 +8,9 @@ class ElectricFunctionModelSvgGroupPT :public ElectricFunctionModelSvgGroup Q_OBJECT public: ElectricFunctionModelSvgGroupPT(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgGroupPT(const ElectricFunctionModelSvgGroupPT&); virtual ~ElectricFunctionModelSvgGroupPT(); + virtual ElectricFunctionModelSvgGroupPT* clone() const override; virtual void setupFinish(QVariant) override; virtual void updateItem() override; virtual void updateLayout() override; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItem.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItem.h index 83ae1cc..4adc9f9 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItem.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItem.h @@ -10,7 +10,10 @@ public: Q_PROPERTY(QFileInfo Image READ getImage_1 WRITE setImage_1) public: ElectricFunctionModelSvgItem(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItem(const ElectricFunctionModelSvgItem&); virtual ~ElectricFunctionModelSvgItem(); + virtual ElectricFunctionModelSvgItem* clone() const override; + void updateCoordinate() override; void move(const QPointF&) override; virtual void loadSvg(){}; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItem2wTransformer.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItem2wTransformer.h index df6f7b6..4c1979b 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItem2wTransformer.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItem2wTransformer.h @@ -9,7 +9,9 @@ class ElectricFunctionModelSvgItem2wTransformer :public ElectricFunctionModelSvg Q_OBJECT public: ElectricFunctionModelSvgItem2wTransformer(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItem2wTransformer(const ElectricFunctionModelSvgItem2wTransformer&); virtual ~ElectricFunctionModelSvgItem2wTransformer(); + virtual ElectricFunctionModelSvgItem2wTransformer* clone() const override; virtual void setImage_1(QFileInfo) override; protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItem3wTransformer.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItem3wTransformer.h index 3b7bdad..82b2d53 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItem3wTransformer.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItem3wTransformer.h @@ -9,7 +9,9 @@ class ElectricFunctionModelSvgItem3wTransformer :public ElectricFunctionModelSvg Q_OBJECT public: ElectricFunctionModelSvgItem3wTransformer(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItem3wTransformer(const ElectricFunctionModelSvgItem3wTransformer&); virtual ~ElectricFunctionModelSvgItem3wTransformer(); + virtual ElectricFunctionModelSvgItem3wTransformer* clone() const override; virtual void setImage_1(QFileInfo) override; protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemBus.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemBus.h index 728c32e..aaa271e 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemBus.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemBus.h @@ -8,7 +8,9 @@ class ElectricFunctionModelSvgItemBus :public ElectricFunctionModelSvgItem Q_OBJECT public: ElectricFunctionModelSvgItemBus(const QRect &rect, QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItemBus(const ElectricFunctionModelSvgItemBus&); virtual ~ElectricFunctionModelSvgItemBus(); + virtual ElectricFunctionModelSvgItemBus* clone() const override; virtual void setImage_1(QFileInfo) override; void addPort(); public: diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCB.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCB.h index 1911038..08e8886 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCB.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCB.h @@ -10,7 +10,9 @@ class ElectricFunctionModelSvgItemCB :public ElectricFunctionModelSvgItem Q_OBJECT public: ElectricFunctionModelSvgItemCB(const QRect &rect, bool genNewPort = true,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItemCB(const ElectricFunctionModelSvgItemCB&); virtual ~ElectricFunctionModelSvgItemCB(); + virtual ElectricFunctionModelSvgItemCB* clone() const override; virtual void setImage_1(QFileInfo) override; protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.h index 67cd8f2..71f3af9 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.h @@ -8,7 +8,9 @@ class ElectricFunctionModelSvgItemCT :public ElectricFunctionModelSvgItem Q_OBJECT public: ElectricFunctionModelSvgItemCT(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItemCT(const ElectricFunctionModelSvgItemCT&); virtual ~ElectricFunctionModelSvgItemCT(); + virtual ElectricFunctionModelSvgItemCT* clone() const override; void setItemType(int n){_itemType = n;} private: void initial(); diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableEnd.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableEnd.h index 75d252c..864034d 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableEnd.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableEnd.h @@ -9,7 +9,9 @@ class ElectricFunctionModelSvgItemCableEnd :public ElectricFunctionModelSvgItem Q_OBJECT public: ElectricFunctionModelSvgItemCableEnd(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItemCableEnd(const ElectricFunctionModelSvgItemCableEnd&); virtual ~ElectricFunctionModelSvgItemCableEnd(); + virtual ElectricFunctionModelSvgItemCableEnd* clone() const override; virtual void setImage_1(QFileInfo) override; protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableTer.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableTer.h index d20fb52..08155be 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableTer.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableTer.h @@ -9,7 +9,9 @@ class ElectricFunctionModelSvgItemCableTer :public ElectricFunctionModelSvgItem Q_OBJECT public: ElectricFunctionModelSvgItemCableTer(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItemCableTer(const ElectricFunctionModelSvgItemCableTer&); virtual ~ElectricFunctionModelSvgItemCableTer(); + virtual ElectricFunctionModelSvgItemCableTer* clone() const override; virtual void setImage_1(QFileInfo) override; protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemDS.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemDS.h index cbe248b..2546a21 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemDS.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemDS.h @@ -8,7 +8,9 @@ class ElectricFunctionModelSvgItemDS :public ElectricFunctionModelSvgItem Q_OBJECT public: ElectricFunctionModelSvgItemDS(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItemDS(const ElectricFunctionModelSvgItemDS&); virtual ~ElectricFunctionModelSvgItemDS(); + virtual ElectricFunctionModelSvgItemDS* clone() const override; virtual void setImage_1(QFileInfo) override; protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemDTEDS.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemDTEDS.h index bdf6f2c..0a0638e 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemDTEDS.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemDTEDS.h @@ -9,7 +9,9 @@ class ElectricFunctionModelSvgItemDTEDS:public ElectricFunctionModelSvgItem Q_OBJECT public: ElectricFunctionModelSvgItemDTEDS(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItemDTEDS(const ElectricFunctionModelSvgItemDTEDS&); virtual ~ElectricFunctionModelSvgItemDTEDS(); + virtual ElectricFunctionModelSvgItemDTEDS* clone() const override; virtual void setImage_1(QFileInfo) override; protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemES.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemES.h index 44ead31..d94c405 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemES.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemES.h @@ -8,7 +8,9 @@ class ElectricFunctionModelSvgItemES :public ElectricFunctionModelSvgItem Q_OBJECT public: ElectricFunctionModelSvgItemES(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItemES(const ElectricFunctionModelSvgItemES&); virtual ~ElectricFunctionModelSvgItemES(); + virtual ElectricFunctionModelSvgItemES* clone() const override; virtual void setImage_1(QFileInfo) override; protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemFES.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemFES.h index 1e77f9e..b7c0ba6 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemFES.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemFES.h @@ -8,7 +8,9 @@ class ElectricFunctionModelSvgItemFES :public ElectricFunctionModelSvgItem Q_OBJECT public: ElectricFunctionModelSvgItemFES(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItemFES(const ElectricFunctionModelSvgItemFES&); virtual ~ElectricFunctionModelSvgItemFES(); + virtual ElectricFunctionModelSvgItemFES* clone() const override; virtual void setImage_1(QFileInfo) override; protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemImage.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemImage.h index 9e869a9..51fff6d 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemImage.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemImage.h @@ -14,7 +14,9 @@ public: Q_PROPERTY(int TextSize READ getFontSize WRITE setFontSize) public: ElectricFunctionModelSvgItemImage(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItemImage(const ElectricFunctionModelSvgItemImage&); virtual ~ElectricFunctionModelSvgItemImage(); + virtual ElectricFunctionModelSvgItemImage* clone() const override; virtual void setImage_1(QFileInfo) override; void setText(const QString& text); diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemLA.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemLA.h index 443e4eb..ba513f3 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemLA.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemLA.h @@ -9,7 +9,9 @@ class ElectricFunctionModelSvgItemLA :public ElectricFunctionModelSvgItem Q_OBJECT public: ElectricFunctionModelSvgItemLA(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItemLA(const ElectricFunctionModelSvgItemLA&); virtual ~ElectricFunctionModelSvgItemLA(); + virtual ElectricFunctionModelSvgItemLA* clone() const override; virtual void setImage_1(QFileInfo) override; protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemPI.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemPI.h index 4a3ed29..8a9a019 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemPI.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemPI.h @@ -9,7 +9,9 @@ class ElectricFunctionModelSvgItemPI :public ElectricFunctionModelSvgItem Q_OBJECT public: ElectricFunctionModelSvgItemPI(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItemPI(const ElectricFunctionModelSvgItemPI&); virtual ~ElectricFunctionModelSvgItemPI(); + virtual ElectricFunctionModelSvgItemPI* clone() const override; virtual void setImage_1(QFileInfo) override; protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.h b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.h index 63d5ce2..014a43c 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.h @@ -8,7 +8,9 @@ class ElectricFunctionModelSvgItemPT :public ElectricFunctionModelSvgItem Q_OBJECT public: ElectricFunctionModelSvgItemPT(const QRect &rect,QGraphicsItem *parent = 0); + ElectricFunctionModelSvgItemPT(const ElectricFunctionModelSvgItemPT&); virtual ~ElectricFunctionModelSvgItemPT(); + virtual ElectricFunctionModelSvgItemPT* clone() const override; void setItemType(int n){_itemType = n;} protected: virtual void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*) override; diff --git a/diagramCavas/include/graphicsItem/functionModelItem/graphicsFunctionModelItem.h b/diagramCavas/include/graphicsItem/functionModelItem/graphicsFunctionModelItem.h index 661c61c..1e9a4c1 100644 --- a/diagramCavas/include/graphicsItem/functionModelItem/graphicsFunctionModelItem.h +++ b/diagramCavas/include/graphicsItem/functionModelItem/graphicsFunctionModelItem.h @@ -16,7 +16,9 @@ public: Q_PROPERTY(EventList Events READ getEvents WRITE setEvents) public: GraphicsFunctionModelItem(QGraphicsItem *parent); + GraphicsFunctionModelItem(const GraphicsFunctionModelItem&); virtual ~GraphicsFunctionModelItem(); + virtual GraphicsFunctionModelItem* clone() const override; QMap getMap(); //bool值为数据源指针类型 void setMap(QMap); diff --git a/diagramCavas/include/graphicsItem/graphicsBaseItem.h b/diagramCavas/include/graphicsItem/graphicsBaseItem.h index ccdb144..900228d 100644 --- a/diagramCavas/include/graphicsItem/graphicsBaseItem.h +++ b/diagramCavas/include/graphicsItem/graphicsBaseItem.h @@ -17,10 +17,9 @@ #include #include #include "propertyType/dataSourceType.h" +#include "graphicsDataModel/fixedPortsModel.h" //#include "graphicsItem/itemPort.h" -class FixedPortsModel; - enum ShapeType { T_undefined, @@ -161,10 +160,15 @@ public: { setFlag(QGraphicsItem::ItemIsSelectable, true); } + GraphicsNonStandardItem(const GraphicsNonStandardItem& obj) + :AbstractShapeType(obj) + { + setFlag(QGraphicsItem::ItemIsSelectable, true); + } virtual ~GraphicsNonStandardItem(){}; + virtual GraphicsNonStandardItem* clone() const = 0; virtual void setProperty(AbstractProperty* p){_property = p;} virtual AbstractProperty* getProperty() {return _property;} - bool containsPoint(const QPointF& pos) { QPointF localPos = mapFromScene(pos); @@ -238,8 +242,8 @@ public: virtual bool hasDynamicText(const QString& tag); virtual void setDynamicLayoutRadius(qreal radius); virtual QMap getDynamicText() {return m_mapDynamicText;} - void setHandle(FixedPortsModel* p){_pHandle = p;} - FixedPortsModel* getHandle() {return _pHandle;} + void setHandle(QPointer p){_pHandle = p;} + FixedPortsModel* getHandle() {return _pHandle.data();} virtual void img_1_selected(QString sMeta,QString sModel,QByteArray img){}; virtual void img_2_selected(QString sMeta,QString sModel,QByteArray img){}; virtual void img_3_selected(QString sMeta,QString sModel,QByteArray img){}; @@ -529,7 +533,7 @@ protected: QList getAllComponentRects() const; //获取图所有碰撞矩形 QList getObstacleShapes() const; //获取所有碰撞shape protected: - FixedPortsModel* _pHandle; + QPointer _pHandle; ModelProperty* _property; PowerEntity* _pEntity; //图元拓扑 bool _itemChanged; //图元变化标志,判断是否需要保存 diff --git a/diagramCavas/include/propertyDialog.h b/diagramCavas/include/propertyDialog.h index 492a905..b7636eb 100644 --- a/diagramCavas/include/propertyDialog.h +++ b/diagramCavas/include/propertyDialog.h @@ -16,6 +16,7 @@ public: void removeContent(QWidget* content); private: QVBoxLayout* _layout; + QWidget* _curWidget; }; #endif diff --git a/diagramCavas/include/selectPanel.h b/diagramCavas/include/selectPanel.h new file mode 100644 index 0000000..3d49494 --- /dev/null +++ b/diagramCavas/include/selectPanel.h @@ -0,0 +1,24 @@ +#ifndef SELECTPANEL_H +#define SELECTPANEL_H + +#include +#include "baseDrawingPanel.h" + +/***********自定义生成HMI操作画布***********/ + +class PowerEntity; + +class SelectPanel : public BaseDrawingPanel +{ + Q_OBJECT + +public: + SelectPanel(PowerEntity* pEntity,QWidget *parent = nullptr,DiagramMode mode = DM_customHMI); + ~SelectPanel(); + + QJsonObject getDiagramInfo(); //重载 + virtual void loadNodes(QJsonObject obj) override; //加载图元信息 + void clearItems(); //清空当前item +}; + +#endif diff --git a/diagramCavas/source/cornerMonitorLauncher.cpp b/diagramCavas/source/cornerMonitorLauncher.cpp index 569a38f..a8d4c4e 100644 --- a/diagramCavas/source/cornerMonitorLauncher.cpp +++ b/diagramCavas/source/cornerMonitorLauncher.cpp @@ -9,7 +9,7 @@ CornerMonitorLauncher::CornerMonitorLauncher(QMdiArea* parent) ,m_mdiArea(parent) { setFixedSize(48, 48); - setWindowFlags(Qt::Tool | Qt::FramelessWindowHint); + setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); setAttribute(Qt::WA_TranslucentBackground); positionAtCorner(); @@ -70,8 +70,16 @@ void CornerMonitorLauncher::showQuickMenu() { } void CornerMonitorLauncher::positionAtCorner() { + if (!m_mdiArea || !m_mdiArea->isVisible()) { + return; + } + + // 获取mdiArea右上角在屏幕坐标系中的位置 QPoint topRight = m_mdiArea->mapToGlobal(m_mdiArea->rect().topRight()); + int x = topRight.x() - width() - 20; int y = topRight.y() + 20; + + // 如果这是顶级窗口,直接使用屏幕坐标 move(x, y); } diff --git a/diagramCavas/source/createHMIdlg.cpp b/diagramCavas/source/createHMIdlg.cpp index 8591362..c4ff278 100644 --- a/diagramCavas/source/createHMIdlg.cpp +++ b/diagramCavas/source/createHMIdlg.cpp @@ -21,6 +21,7 @@ void CreateHMIdlg::initial() { connect(ui->btn_cancel,&QPushButton::clicked,this,&CreateHMIdlg::onCancelClicked); connect(ui->btn_ok,&QPushButton::clicked,this,&CreateHMIdlg::onSaveClicked); + connect(ui->btn_custom,&QPushButton::clicked,this,&CreateHMIdlg::onCustomClicked); } void CreateHMIdlg::showDlg() @@ -39,6 +40,13 @@ void CreateHMIdlg::onCancelClicked() hide(); } +void CreateHMIdlg::onCustomClicked() +{ + QString sName = ui->cb_structure->currentText(); + emit createCustomHMI(ui->lineEdit->text(),sName); + hide(); +} + void CreateHMIdlg::onSaveClicked() { QString sName = ui->cb_structure->currentText(); diff --git a/diagramCavas/source/customHMIGenerateDlg.cpp b/diagramCavas/source/customHMIGenerateDlg.cpp new file mode 100644 index 0000000..3aa039f --- /dev/null +++ b/diagramCavas/source/customHMIGenerateDlg.cpp @@ -0,0 +1,91 @@ +#include "customHMIGenerateDlg.h" +#include "dataBase.h" +#include "selectPanel.h" +#include "powerEntity.h" +#include "diagramCavas.h" +#include "customHMIList.h" +#include "ui_customHMIGenerateDlg.h" +#include + +CustomHMIGenerateDlg::CustomHMIGenerateDlg(QWidget *parent) + : QDialog(parent) + , ui(new Ui::customHMIGenerateDlg) + ,_pOperatePanel(nullptr) + ,_pPreviewPanel(nullptr) + ,_pPe(nullptr) + ,_pOe(nullptr) + ,_pItemList(nullptr) +{ + ui->setupUi(this); + _pCanvas = dynamic_cast(parent); + this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); + initial(); +} + +CustomHMIGenerateDlg::~CustomHMIGenerateDlg() +{ + delete ui; + if(_pPe) + delete _pPe; + if(_pOe) + delete _pOe; +} + +void CustomHMIGenerateDlg::initial() +{ + _pItemList = new CustomHMIList(this); + connect(ui->btn_return,&QPushButton::clicked,this,&CustomHMIGenerateDlg::onBackClicked); + connect(ui->btn_generate,&QPushButton::clicked,this,&CustomHMIGenerateDlg::onGenerateClicked); + QVBoxLayout* layOut = new QVBoxLayout(ui->gb_list); + layOut->addWidget(_pItemList); + + _pPe = new ConfigurationDiagram("0","oprerate"); + _pOperatePanel = new SelectPanel(_pPe,this,DM_customHMI); + + _pOe = new ConfigurationDiagram("1","preview"); + _pPreviewPanel = new SelectPanel(_pOe,this,DM_customHMI); + + QVBoxLayout *layOperate = new QVBoxLayout(ui->gb_sys); + layOperate->addWidget(_pOperatePanel); + _pOperatePanel->getModelController()->setCavas(QPointer(_pCanvas)); + + QVBoxLayout *layPreview= new QVBoxLayout(ui->gb_preview); + layPreview->addWidget(_pPreviewPanel); + _pPreviewPanel->getModelController()->setCavas(QPointer(_pCanvas)); + + connect(_pOperatePanel->getModelController(),&FixedPortsModel::updateCurrentItems,_pItemList,&CustomHMIList::onUpdateItems); + connect(_pOperatePanel->getModelController(),&FixedPortsModel::itemSelected,_pItemList,&CustomHMIList::onSelectItems); + connect(_pItemList,&CustomHMIList::previewHMI,this,&CustomHMIGenerateDlg::onPreviewHMI); +} + +void CustomHMIGenerateDlg::showDlg(QString sHmi,QString sSys,int nModel) +{ + show(); + ui->le_hmiName->setText(sHmi); + DataBase* db = DataBase::GetInstance(); + if (!db) { + qWarning() << "Database instance is null"; + return; + } + + _pOperatePanel->getModelController()->clearCurItems(); //先清空 + QJsonObject context = db->getHMIContextByTag(sSys); + _pOperatePanel->loadNodes(context); +} + +void CustomHMIGenerateDlg::onGenerateClicked() +{ + hide(); +} + +void CustomHMIGenerateDlg::onBackClicked() +{ + emit backCreateHMI(); + hide(); +} + +void CustomHMIGenerateDlg::onPreviewHMI(QList lst) +{ + _pPreviewPanel->clearItems(); + _pOperatePanel->getModelController()->previewHMI(_pPreviewPanel,lst); +} diff --git a/diagramCavas/source/customHMIList.cpp b/diagramCavas/source/customHMIList.cpp new file mode 100644 index 0000000..5e0acf6 --- /dev/null +++ b/diagramCavas/source/customHMIList.cpp @@ -0,0 +1,252 @@ +#include "customHMIList.h" +#include +#include +#include "tools.h" + +CustomHMIList::CustomHMIList(QWidget *parent) + : QWidget(parent) + ,_modelAll(nullptr) + ,_tree(nullptr) +{ + initial(); +} + +CustomHMIList::~CustomHMIList() +{ + +} + +void CustomHMIList::initial() +{ + QVBoxLayout* layOut = new QVBoxLayout(this); + _tree = new QTreeView(this); + layOut->addWidget(_tree); + layOut->setContentsMargins(0,0,0,0); + + + _modelAll = new QStandardItemModel(this); + _tree->setModel(_modelAll); + _tree->setHeaderHidden(true); + connect(_modelAll, &QStandardItemModel::itemChanged,this, &CustomHMIList::onItemChanged); +} + +void CustomHMIList::onUpdateItems(QList lst,bool refresh) +{ + if(refresh){ + QStandardItem *root = _modelAll->invisibleRootItem(); + int rowCount = root->rowCount(); + if (rowCount > 0) { + _modelAll->removeRows(0, rowCount); + } + // 清空间隔节点缓存 + m_mapBayItems.clear(); + } + + // 先处理间隔节点(nCategory == 1) + for(auto &info:lst){ + auto curItem = info.item; + if(curItem.nCategory == 1){ // 间隔信息 + // 查找是否已存在该间隔节点 + QStandardItem* pBayItem = findBayItem(curItem.sName); + if(!pBayItem){ + // 创建间隔节点 + pBayItem = new QStandardItem(curItem.sName); + pBayItem->setCheckable(true); // 启用勾选框 + pBayItem->setCheckState(Qt::Unchecked); + pBayItem->setData(curItem.nCategory, Qt::UserRole+1); // 存储类别 + pBayItem->setData(curItem.nEquipType, Qt::UserRole+2); // 存储设备类型 + pBayItem->setData(curItem.uid, Qt::UserRole+3); // 存储UUID + + // 存储到缓存中 + m_mapBayItems[curItem.sName] = pBayItem; + _modelAll->appendRow(pBayItem); + } + } + } + + // 再处理设备节点(nCategory == 0) + for(auto &info:lst){ + auto curItem = info.item; + if(curItem.nCategory == 0){ // 设备信息 + // 获取设备所属的间隔名称 + QString bayName = info.parent.sName; + + if(!bayName.isEmpty()){ + // 查找对应的间隔节点 + QStandardItem* pBayItem = findBayItem(bayName); + + if(pBayItem){ + // 创建设备节点 + QStandardItem *pItem = new QStandardItem(curItem.sName); + pItem->setCheckable(true); // 启用勾选框 + pItem->setCheckState(Qt::Unchecked); + pItem->setData(curItem.nCategory, Qt::UserRole+1); + pItem->setData(curItem.nEquipType, Qt::UserRole+2); + pItem->setData(curItem.uid, Qt::UserRole+3); + + // 不再为母线或独立设备添加子设备 + // 所有设备都作为间隔的直接子节点 + + pBayItem->appendRow(pItem); + } + } + } + } + + // 展开所有节点 + _tree->expandAll(); +} + +void CustomHMIList::onSelectItems(QList lst) +{ + resetSelect(); + for(auto& info:lst){ + QModelIndex itemIndex = findIndex(_modelAll,info.item.uid,Qt::UserRole+3); + if(itemIndex.isValid()) + { + QStandardItem *pItem = _modelAll->itemFromIndex(itemIndex); + pItem->setCheckState(Qt::Checked); + } + } + generatePreview(); +} + +void CustomHMIList::generatePreview() +{ + QList lst; + QList lstItem = getTreeViewCheckedItems(_tree); + for(auto& pItem:lstItem){ + HierarchyItem info; + auto pParent = pItem->parent(); + if(pParent){ + info.parent.nCategory = pParent->data(Qt::UserRole+1).toInt(); + info.parent.nEquipType = pParent->data(Qt::UserRole+2).toInt(); + info.parent.uid = pParent->data(Qt::UserRole+3).toUuid(); + info.parent.sName = pParent->text(); + } + info.item.nCategory = pItem->data(Qt::UserRole+1).toInt(); + info.item.nEquipType = pItem->data(Qt::UserRole+2).toInt(); + info.item.uid = pItem->data(Qt::UserRole+3).toUuid(); + info.item.sName = pItem->text(); + + auto lstChild = getAllChildren(pItem); + for(auto &child:lstChild){ + HierarchyStructItem stru; + stru.nCategory = child->data(Qt::UserRole+1).toInt(); + stru.nEquipType = child->data(Qt::UserRole+2).toInt(); + stru.uid = child->data(Qt::UserRole+3).toUuid(); + stru.sName = child->text(); + info.subList.append(stru); + } + lst.append(info); + } + + emit previewHMI(lst); +} + +void CustomHMIList::onMonitorCreated(QList lst) +{ + +} + +void CustomHMIList::onItemChanged(QStandardItem *item) +{ + QSignalBlocker blocker(_modelAll); + + if (item->isCheckable()) { + Qt::CheckState newState = item->checkState(); + // 设置所有子项与父项相同的状态 + setChildrenCheckState(item, newState); + } + + _tree->repaint(); +} + +void CustomHMIList::setChildrenCheckState(QStandardItem *parent, Qt::CheckState state) { + for (int row = 0; row < parent->rowCount(); ++row) { + QStandardItem *child = parent->child(row, 0); // 第一列 + if (child && child->isCheckable()) { + child->setCheckState(state); + setChildrenCheckState(child, state); + } + } +} + +void CustomHMIList::traverseSelectStandardItemModel(QStandardItemModel *model,Qt::CheckState check) { + if (!model) return; + + // 遍历所有顶层项 + for (int row = 0; row < model->rowCount(); ++row) { + for (int col = 0; col < model->columnCount(); ++col) { + QStandardItem *item = model->item(row, col); + item->setCheckState(check); + traverseSelectStandardItem(item, 0,check); + } + } +} + +void CustomHMIList::traverseSelectStandardItem(QStandardItem *item, int depth,Qt::CheckState check) { + if (!item) return; + + // 遍历子项 + for (int row = 0; row < item->rowCount(); ++row) { + for (int col = 0; col < item->columnCount(); ++col) { + QStandardItem *child = item->child(row, col); + child->setCheckState(check); + traverseSelectStandardItem(child, depth + 1,check); + } + } +} + +QStandardItem* CustomHMIList::findBayItem(const QString& bayName) +{ + // 先从缓存查找 + if(m_mapBayItems.contains(bayName)){ + return m_mapBayItems[bayName]; + } + + // 遍历查找 + for(int i = 0; i < _modelAll->rowCount(); ++i){ + QStandardItem* pItem = _modelAll->item(i); + if(pItem->text() == bayName && + pItem->data(Qt::UserRole+1).toInt() == 1){ // 类别为间隔 + return pItem; + } + } + return nullptr; +} + +QList CustomHMIList::getCheckedItems(QStandardItem* parentItem) { + QList checkedItems; + + if (!parentItem) return checkedItems; + + for (int i = 0; i < parentItem->rowCount(); ++i) { + QStandardItem* childItem = parentItem->child(i); + + if (childItem->checkState() == Qt::Checked) { + checkedItems.append(childItem); + } + + // 递归检查子项 + checkedItems.append(getCheckedItems(childItem)); + } + + return checkedItems; +} + +// 主函数:获取treeView中所有checked项 +QList CustomHMIList::getTreeViewCheckedItems(QTreeView* treeView) { + QList checkedItems; + + QStandardItemModel* model = qobject_cast(treeView->model()); + if (!model) return checkedItems; + + QStandardItem* rootItem = model->invisibleRootItem(); + return getCheckedItems(rootItem); +} + +void CustomHMIList::resetSelect() +{ + traverseSelectStandardItemModel(_modelAll,Qt::Unchecked); +} diff --git a/diagramCavas/source/designerView.cpp b/diagramCavas/source/designerView.cpp index b11dc03..4c3b3ad 100644 --- a/diagramCavas/source/designerView.cpp +++ b/diagramCavas/source/designerView.cpp @@ -1,5 +1,4 @@ #include "designerView.h" -#include "designerScene.h" #include #define MAX_ZoomValue 50.0 diff --git a/diagramCavas/source/diagramCavas.cpp b/diagramCavas/source/diagramCavas.cpp index e6cde77..5f736da 100644 --- a/diagramCavas/source/diagramCavas.cpp +++ b/diagramCavas/source/diagramCavas.cpp @@ -2,7 +2,7 @@ #include "diagramCavas_p.h" DiagramCavas::DiagramCavas(QWidget *parent) - : QMdiArea(parent) + : QWidget(parent) ,d_ptr(new DiagramCavasPrivate(this)) { Q_D(DiagramCavas); @@ -11,8 +11,8 @@ DiagramCavas::DiagramCavas(QWidget *parent) DiagramCavas::~DiagramCavas() { Q_D(DiagramCavas); - delete d; disconnect(); //断开连接避免动态库释放时信号问题 + delete d; } MonitorPanel* DiagramCavas::getMonitorPanel(QString sPage) @@ -68,15 +68,7 @@ void DiagramCavas::initial() void DiagramCavas::setCurMode(int nMode) { Q_D(DiagramCavas); - d->_curMode = nMode; - if(d->_curMode == 1){ //运行模式下 - showPropertyDlg(); - //setViewMode(QMdiArea::SubWindowView); - } - else{ - hidePropertyDlg(); - //setViewMode(QMdiArea::TabbedView); - } + d->setCurMode(nMode); } int DiagramCavas::getCurMode() @@ -120,14 +112,10 @@ void DiagramCavas::onSignal_addDrawingPanel(PowerEntity* pItem,DiagramMode mode, void DiagramCavas::onSignal_addGraphicsItem(ModelStateInfo& info) { - QMdiSubWindow* actWindow = activeSubWindow(); + /*QMdiSubWindow* actWindow = activeSubWindow(); if(!actWindow) return; - QWidget* pWindow= currentSubWindow()->widget(); - /*DrawingPanel* pPanel = dynamic_cast(pWindow); - - if(pPanel) - pPanel->onSignal_addGraphicsItem(info);*/ + QWidget* pWindow= currentSubWindow()->widget();*/ } void DiagramCavas::onSignal_addPage() @@ -183,12 +171,7 @@ void DiagramCavas::onSignal_activatePage(const QString& name) void DiagramCavas::onSignal_panelDelete(const QString& name,int nType) { Q_D(DiagramCavas); - if(nType == 2){ - MonitorPanel* pPanel = d->m_mapMonitorPanel.take(name).first; - this->removeSubWindow(pPanel); - delete pPanel; - } - d->calculateLauncherVisible(); + d->deletePanel(name,nType); } void DiagramCavas::onSignal_createEntity(EntityInfo info) @@ -469,6 +452,9 @@ void DiagramCavas::updateMonitorListFromDB(int dest) } } }*/ + + Q_D(DiagramCavas); + d->updateHMIListFormDB(); } void DiagramCavas::onSignal_updateMonitorTopology(QList lst) diff --git a/diagramCavas/source/diagramCavas_p.cpp b/diagramCavas/source/diagramCavas_p.cpp index 1565199..9483c05 100644 --- a/diagramCavas/source/diagramCavas_p.cpp +++ b/diagramCavas/source/diagramCavas_p.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "graphicsItem/graphicsBaseItem.h" #include "topologyManager.h" #include "powerEntity.h" @@ -29,10 +30,12 @@ #include "structDataPreviewDlg.h" #include "extraPropertyManager.h" #include "createHMIdlg.h" +#include "customHMIGenerateDlg.h" #include "pluginManager.h" #include "graphicsItem/pluginItemFactory.h" #include "QDetailsView.h" #include "propertyDialog.h" +#include "logger.h" #include "basePannelPropertyProxy.h" #include "QDetailsView.h" @@ -63,6 +66,10 @@ DiagramCavasPrivate::DiagramCavasPrivate(DiagramCavas* q) DiagramCavasPrivate::~DiagramCavasPrivate() { // 清理代码 + if(_pPropertyPage){ + //_pPropertyPage->setObject(new QObject(q_ptr)); + delete _pPropertyPage; + } if (_cornerButton) delete _cornerButton; if (_loadMonitorPageDlg) delete _loadMonitorPageDlg; if (_connectSetting) delete _connectSetting; @@ -76,6 +83,7 @@ void DiagramCavasPrivate::initialImpl() { Q_Q(DiagramCavas); + m_mdiArea = new QMdiArea(q); // 1. 读取数据并初始化页面 QList lst = DataBase::GetInstance()->getAllPage(); for (auto &info : lst) { @@ -83,8 +91,9 @@ void DiagramCavasPrivate::initialImpl() } // 2. 初始化角落监控启动器 - _cornerButton = new CornerMonitorLauncher(q); + _cornerButton = new CornerMonitorLauncher(m_mdiArea); _cornerButton->showDlg(); + //LOG_INFO("CanvasIni", QString("Insert bay fail")); // 3. 初始化加载监控页面对话框 _loadMonitorPageDlg = new LoadMonitorPageDlg(q); @@ -143,7 +152,14 @@ void DiagramCavasPrivate::initialImpl() // 12. 初始化创建HMI对话框 _createHMIDlg = new CreateHMIdlg(q); QObject::connect(_createHMIDlg, &CreateHMIdlg::createHMI, q, &DiagramCavas::onSignal_createHMIClicked); + QObject::connect(_createHMIDlg, &CreateHMIdlg::createCustomHMI, q, [this](QString sName,QString sSys,int nModel){ + _customCreateHMIDlg->showDlg(sName,sSys,nModel); + }); + _customCreateHMIDlg = new CustomHMIGenerateDlg(q); + QObject::connect(_customCreateHMIDlg, &CustomHMIGenerateDlg::backCreateHMI, q, [this](){ + _createHMIDlg->showDlg(); + }); // 13. 从数据库更新HMI列表 q->updateHMIlstFromDB(); @@ -164,7 +180,7 @@ void DiagramCavasPrivate::initialImpl() m_pluginManager->loadAllPlugins(pluginsDir); // 18. 初始化属性对话框 - _pPropertyDlg = new PropertyDlg(q->parentWidget()); + _pPropertyDlg = new PropertyDlg(); _pPropertyDlg->hide(); // 19. 添加快捷键 @@ -172,6 +188,9 @@ void DiagramCavasPrivate::initialImpl() // 20. 设置视图模式 // q->setViewMode(QMdiArea::TabbedView); + QHBoxLayout* mainLayout = new QHBoxLayout(q); + mainLayout->addWidget(m_mdiArea, 1); // 主工作区占主要空间 + mainLayout->addWidget(_pPropertyDlg, 0); // 属性栏占次要空间 } void DiagramCavasPrivate::removePanel(PowerEntity* pEntity) @@ -185,8 +204,8 @@ void DiagramCavasPrivate::removePanel(PowerEntity* pEntity) MonitorPanel* pPanel = m_mapMonitorPanel.take(iter.key()).first; QWidget* pWindow = static_cast(pPanel); - q->setActiveSubWindow(iter->second); - q->closeActiveSubWindow(); + m_mdiArea->setActiveSubWindow(iter->second); + m_mdiArea->closeActiveSubWindow(); //removeSubWindow(pPanel); //todo:记录删除组态图,从数据库中删除 delete pPanel; @@ -306,7 +325,7 @@ void DiagramCavasPrivate::processRecommandData(const HttpRecommandInfo& info) } // 3. 获取当前子窗口 - QMdiSubWindow* currentSubWindow = q->currentSubWindow(); + QMdiSubWindow* currentSubWindow = m_mdiArea->currentSubWindow(); if (!currentSubWindow) { qDebug() << "No active window, skipping panel update"; return; @@ -340,11 +359,23 @@ void DiagramCavasPrivate::processRecommandData(const HttpRecommandInfo& info) void DiagramCavasPrivate::onTargetSelected(QObject* obj) { Q_Q(DiagramCavas); - if(obj){ - if(_curMode == 0) - emit q->selectTarget(obj); - else + + if (!obj) return; + + if (_curMode == 0) { // 编辑模式 + // 发送给主窗口 + emit q->selectTarget(obj); + + // 确保运行模式属性页清空 + if (_pPropertyPage) { + _pPropertyPage->setObject(q); + } + } + else { // 运行模式 + // 只在实际显示时才设置 + if (_pPropertyPage && _pPropertyDlg && _pPropertyDlg->isVisible()) { _pPropertyPage->setObject(obj); + } } } @@ -366,11 +397,56 @@ void DiagramCavasPrivate::updateHMIFromDB() } } +void DiagramCavasPrivate::updateHMIListFormDB() +{ + _loadMonitorPageDlg->clearItems(); + + QList lstHMI = DataBase::GetInstance()->getAllHMI(); + for(auto &info:lstHMI) + { + auto p = TopologyManager::instance().findDiagram(info.uid.toString(),ModelFunctionType::RuntimeModel); + if(!p){ + TopologyManager::instance().createDiagram(info.uid.toString(),info.name,ModelFunctionType::RuntimeModel); + _loadMonitorPageDlg->updateItems("HMI组态",qMakePair(info.name,info.uid)); + } + else{ //存在直接更新 + _loadMonitorPageDlg->updateItems("HMI组态",qMakePair(info.name,info.uid)); + } + } +} + +void DiagramCavasPrivate::deletePanel(const QString& name,int nType) +{ + if(nType == 2){ + MonitorPanel* pPanel = m_mapMonitorPanel.take(name).first; + m_mdiArea->removeSubWindow(pPanel); + delete pPanel; + } + calculateLauncherVisible(); +} + +void DiagramCavasPrivate::setCurMode(int nMode) +{ + Q_Q(DiagramCavas); + _curMode = nMode; + + if (_curMode == 1) { // 运行模式 + emit q->clearSelection(); // 通知主窗口清空 + + // 延迟显示属性对话框 + QTimer::singleShot(100, q, [q]() { + q->showPropertyDlg(); + }); + } + else { // 编辑模式 + q->hidePropertyDlg(); + } +} + void DiagramCavasPrivate::initPropertyPage() { if (_pPropertyPage == nullptr) { _pPropertyPage = new QDetailsView(); - _pPropertyPage->setObject(new QObject(q_ptr)); // 可以在这里配置属性页的更多设置 _pPropertyPage->setWindowTitle("属性面板"); @@ -384,7 +460,7 @@ void DiagramCavasPrivate::initPropertyPage() void DiagramCavasPrivate::showPropertyDlgImpl() { - Q_Q(DiagramCavas); + /*Q_Q(DiagramCavas); // 确保属性页面已初始化 initPropertyPage(); @@ -403,20 +479,36 @@ void DiagramCavasPrivate::showPropertyDlgImpl() } // 设置内容 - _pPropertyDlg->setContent(_pPropertyPage); _pPropertyDlg->show(); + _pPropertyDlg->setContent(_pPropertyPage);*/ + //_pPropertyPage->setObject(q_ptr); // 居中显示 - centerPropertyDialogOnScreen(); + //centerPropertyDialogOnScreen(); // 激活窗口 - _pPropertyDlg->raise(); - _pPropertyDlg->activateWindow(); + //_pPropertyDlg->raise(); + //_pPropertyDlg->activateWindow(); + Q_Q(DiagramCavas); + + initPropertyPage(); + + if (!_pPropertyDlg) { + _pPropertyDlg = new PropertyDlg(q->parentWidget()); + } + + _pPropertyDlg->show(); + _pPropertyDlg->setContent(_pPropertyPage); + } void DiagramCavasPrivate::hidePropertyDlgImpl() { + Q_Q(DiagramCavas); if (_pPropertyDlg) { + if(_pPropertyPage) + delete _pPropertyPage; + _pPropertyPage = nullptr; _pPropertyDlg->hide(); } } @@ -494,7 +586,7 @@ void DiagramCavasPrivate::addMonitorPanel(PowerEntity* pItem, const QString& par pPanel->setParentPage(parent); // 添加到MDI区域 - QMdiSubWindow* pSub = q->addSubWindow(pPanel); + QMdiSubWindow* pSub = m_mdiArea->addSubWindow(pPanel); m_mapMonitorPanel.insert(_curPage, qMakePair(pPanel, pSub)); // 显示面板 @@ -604,7 +696,7 @@ void DiagramCavasPrivate::savePageImpl() Q_Q(DiagramCavas); // 获取当前子窗口 - QMdiSubWindow* currentSubWindow = q->currentSubWindow(); + QMdiSubWindow* currentSubWindow = m_mdiArea->currentSubWindow(); if (!currentSubWindow) { qWarning() << "No active subwindow for saving"; QMessageBox::warning(nullptr, QString("警告"), @@ -836,7 +928,7 @@ BaseDrawingPanel* DiagramCavasPrivate::getCurrentDrawingPanel() const { Q_Q(const DiagramCavas); - QMdiSubWindow* currentSubWindow = q->currentSubWindow(); + QMdiSubWindow* currentSubWindow = m_mdiArea->currentSubWindow(); if (!currentSubWindow) { return nullptr; } @@ -1019,7 +1111,7 @@ bool DiagramCavasPrivate::loadExistingMonitor(const QString& name) // 设置为活动子窗口 Q_Q(DiagramCavas); - q->setActiveSubWindow(subWindow); + m_mdiArea->setActiveSubWindow(subWindow); return true; } diff --git a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp index 01dae43..035d197 100644 --- a/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp +++ b/diagramCavas/source/graphicsDataModel/fixedPortsModel.cpp @@ -27,6 +27,7 @@ #include "extraPropertyManager.h" #include "graphicsItem/itemPort.h" +#include "designerView.h" #include "designerScene.h" #include "dataBase.h" #include "httpInterface.h" @@ -56,6 +57,7 @@ #include "common/core_model/types.h" #include "graphicsItem/pluginSvgItemWrapper.h" #include "graphicsItem/functionModelItem/graphicsEventContext.h" +#include "selectPanel.h" bool FixedPortsModel::_dataInitialised = false; @@ -1735,6 +1737,8 @@ void FixedPortsModel::onDataTimerOut() void FixedPortsModel::onSelectionChanged() { + if(_panelMode == 1) //预览模式不显示属性 + return; QList selectedItems = _scene->selectedItems(); if(_cavas){ int nMode = _cavas->getCurMode(); @@ -1827,6 +1831,14 @@ int FixedPortsModel::getCurMode() return _cavas->getCurMode(); } +void FixedPortsModel::clearCurItems() +{ + if(_scene) + _scene->clear(); + _nodeItem.clear(); + _bayItem.clear(); +} + void FixedPortsModel::addPortsToItem_json(PortState sta,QJsonArray jArr,GraphicsBaseItem* pItem) { for(QJsonValueRef portJson:jArr) @@ -2703,6 +2715,73 @@ void FixedPortsModel::stopAcceptData(QString page) m_dataTimer->stop(); } +void FixedPortsModel::previewHMI(SelectPanel* pPanel,QList lst) +{ + if(_cavas){ + + pPanel->getModelController()->setMonitorRelation(lst); + + QList lstFirst; + QList lstSecond; + for(auto& itemInfo:lst) //第一次循环处理间隔 + { + if(itemInfo.item.nCategory == 1){ //间隔 + if(_bayItem.contains(itemInfo.item.uid)){ + auto pBay = _bayItem.value(itemInfo.item.uid); + BayProperty* pPro = dynamic_cast(pBay->getProperty()); + if(pPro){ + pPanel->getModelController()->addBayByData(pPro); + } + } + lstFirst.append(itemInfo); //在lst插入时判断重复 + } + } + + for(auto& itemInfo:lst) + { + if(itemInfo.item.nCategory == 0){ //设备 + if(_nodeItem.contains(itemInfo.item.uid)){ + auto pItem = _nodeItem.value(itemInfo.item.uid); + BaseProperty* pPro = dynamic_cast(pItem->getProperty()); + if(pPro){ + auto pNewItem = pItem->clone(); + if(pPro->type() == 8){ + auto pLine = dynamic_cast(pNewItem); + if(pLine) + pLine->calculatePath(); + } + else{ + pNewItem->updateItem(); + } + + if(pNewItem && pPanel){ + pNewItem->bindProperty(pPro); + pNewItem->updateHandles(); + pNewItem->updateByProperty(); //使用模型更新自身 + pPanel->getModelController()->addNodeItem(pPro->uuid(),pNewItem); + pPanel->getScene()->addItem(pNewItem); //绑定模型 + } + } + lstSecond.append(itemInfo); + } + } + } + + if(pPanel){ + if (!pPanel->getScene()->items().isEmpty()) { + QRectF itemsRect = pPanel->getScene()->itemsBoundingRect(); + itemsRect.adjust(-100, -100, 100, 100); + /*auto map = _cavas->getMapMonitor(); + if(map.contains(sPage)){ + auto pSubWin = map.value(sPage).second; + pSubWin->resize(itemsRect.width(),itemsRect.height()); + }*/ + pPanel->getView()->fitInView(itemsRect, Qt::KeepAspectRatio); + } + } + } +} + int FixedPortsModel::imageRefExist(QString model,QByteArray hash256) { for(auto& info:_HMIimageRef) diff --git a/diagramCavas/source/graphicsItem/electricBayItem.cpp b/diagramCavas/source/graphicsItem/electricBayItem.cpp index b2ab964..77f14f0 100644 --- a/diagramCavas/source/graphicsItem/electricBayItem.cpp +++ b/diagramCavas/source/graphicsItem/electricBayItem.cpp @@ -14,11 +14,26 @@ ElectricBayItem::ElectricBayItem(const QRectF &rect,QGraphicsItem *parent) setFlag(QGraphicsItem::ItemIgnoresTransformations, false); } +ElectricBayItem::ElectricBayItem(const ElectricBayItem& obj) + :GraphicsNonStandardItem(obj) +{ + m_showRect = obj.m_showRect; + m_dWidth = obj.m_dWidth; + m_dHeight = obj.m_dHeight; + m_font = obj.m_font; + setFlag(QGraphicsItem::ItemIgnoresTransformations, false); +} + ElectricBayItem::~ElectricBayItem() { } +ElectricBayItem* ElectricBayItem::clone() const +{ + return new ElectricBayItem(*this); +} + void ElectricBayItem::setText(const QString& text) { prepareGeometryChange(); // 通知框架几何变化 diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelConnectLineItem.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelConnectLineItem.cpp index eaaa605..819447d 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelConnectLineItem.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelConnectLineItem.cpp @@ -9,10 +9,22 @@ ElectricFunctionModelConnectLineItem::ElectricFunctionModelConnectLineItem(QGrap initial(); } +ElectricFunctionModelConnectLineItem::ElectricFunctionModelConnectLineItem(const ElectricFunctionModelConnectLineItem& obj) + : GraphicsFunctionModelItem(obj) +{ + initial(); + m_lstPoints = obj.m_lstPoints; +} + ElectricFunctionModelConnectLineItem::~ElectricFunctionModelConnectLineItem() { } +ElectricFunctionModelConnectLineItem* ElectricFunctionModelConnectLineItem::clone() const +{ + return new ElectricFunctionModelConnectLineItem(*this); +} + void ElectricFunctionModelConnectLineItem::initial() { m_boundingRect = QRectF(); diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelItemText.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelItemText.cpp index 5d33975..ff7a7d0 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelItemText.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelItemText.cpp @@ -13,11 +13,28 @@ ElectricFunctionModelItemText::ElectricFunctionModelItemText(QGraphicsItem *pare initial(); } +ElectricFunctionModelItemText::ElectricFunctionModelItemText(const ElectricFunctionModelItemText& obj) + : GraphicsFunctionModelItem(obj) +{ + initial(); + m_boundingRect = obj.m_boundingRect; + m_text = obj.m_text; + m_textColor = obj.m_textColor; + m_backgroundColor = obj.m_backgroundColor; + m_font = obj.m_font; + m_backgroundVisible = obj.m_backgroundVisible; +} + ElectricFunctionModelItemText::~ElectricFunctionModelItemText() { } +ElectricFunctionModelItemText* ElectricFunctionModelItemText::clone() const +{ + return new ElectricFunctionModelItemText(*this); +} + void ElectricFunctionModelItemText::setText(const QString& text) { if (m_text != text) { diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelPortItem.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelPortItem.cpp index 52aed91..2661f7d 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelPortItem.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelPortItem.cpp @@ -11,11 +11,22 @@ ElectricFunctionModelPortItem::ElectricFunctionModelPortItem(QGraphicsItem *pare initial(); } +ElectricFunctionModelPortItem::ElectricFunctionModelPortItem(const ElectricFunctionModelPortItem& obj) + : GraphicsFunctionModelItem(obj) +{ + initial(); +} + ElectricFunctionModelPortItem::~ElectricFunctionModelPortItem() { } +ElectricFunctionModelPortItem* ElectricFunctionModelPortItem::clone() const +{ + return new ElectricFunctionModelPortItem(*this); +} + QRectF ElectricFunctionModelPortItem::boundingRect() const { return m_boundingRect; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroup.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroup.cpp index 96971e1..78739d9 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroup.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroup.cpp @@ -14,11 +14,27 @@ ElectricFunctionModelSvgGroup::ElectricFunctionModelSvgGroup(const QRect &rect,Q m_dHeight = rect.height(); } +ElectricFunctionModelSvgGroup::ElectricFunctionModelSvgGroup(const ElectricFunctionModelSvgGroup& obj) + : GraphicsFunctionModelGroup(obj) +{ + m_lastBoudingRect = obj.m_lastBoudingRect; + m_boundingRect = obj.m_boundingRect; + m_dWidth = obj.m_dWidth; + m_dHeight = obj.m_dHeight; + m_mapSvg = obj.m_mapSvg; +} + + ElectricFunctionModelSvgGroup::~ElectricFunctionModelSvgGroup() { } +ElectricFunctionModelSvgGroup* ElectricFunctionModelSvgGroup::clone() const +{ + return new ElectricFunctionModelSvgGroup(*this); +} + QPainterPath ElectricFunctionModelSvgGroup::shape() { QPainterPath path; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupCT.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupCT.cpp index f8c3c44..878fd1d 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupCT.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupCT.cpp @@ -14,11 +14,24 @@ ElectricFunctionModelSvgGroupCT::ElectricFunctionModelSvgGroupCT(const QRect &re initial(); } +ElectricFunctionModelSvgGroupCT::ElectricFunctionModelSvgGroupCT(const ElectricFunctionModelSvgGroupCT& obj) + : ElectricFunctionModelSvgGroup(obj) +{ + initial(); + _nType = obj._nType; + _nSize = obj._nSize; +} + ElectricFunctionModelSvgGroupCT::~ElectricFunctionModelSvgGroupCT() { } +ElectricFunctionModelSvgGroupCT* ElectricFunctionModelSvgGroupCT::clone() const +{ + return new ElectricFunctionModelSvgGroupCT(*this); +} + void ElectricFunctionModelSvgGroupCT::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupPT.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupPT.cpp index ed0972b..06a6275 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupPT.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgGroupPT.cpp @@ -14,11 +14,23 @@ ElectricFunctionModelSvgGroupPT::ElectricFunctionModelSvgGroupPT(const QRect &re initial(); } +ElectricFunctionModelSvgGroupPT::ElectricFunctionModelSvgGroupPT(const ElectricFunctionModelSvgGroupPT& obj) + : ElectricFunctionModelSvgGroup(obj) +{ + initial(); + m_lstType = obj.m_lstType; +} + ElectricFunctionModelSvgGroupPT::~ElectricFunctionModelSvgGroupPT() { } +ElectricFunctionModelSvgGroupPT* ElectricFunctionModelSvgGroupPT::clone() const +{ + return new ElectricFunctionModelSvgGroupPT(*this); +} + void ElectricFunctionModelSvgGroupPT::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItem.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItem.cpp index d6d0f9c..25789a7 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItem.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItem.cpp @@ -19,12 +19,39 @@ ElectricFunctionModelSvgItem::ElectricFunctionModelSvgItem(const QRect &rect,QGr setFunctionHandleEnaable(false); } +ElectricFunctionModelSvgItem::ElectricFunctionModelSvgItem(const ElectricFunctionModelSvgItem& obj) + : GraphicsFunctionModelItem(obj),m_pRender(nullptr),m_pCustomRender(nullptr) +{ + m_lastBoudingRect = obj.m_lastBoudingRect; + m_boundingRect = obj.m_boundingRect; + m_dWidth = obj.m_dWidth; + m_dHeight = obj.m_dHeight; + _tempSvg = obj._tempSvg; + m_mapSvg = obj.m_mapSvg; + + setHandleIfShow(H_textCaption,false); + setHandleVisible(false); + setFunctionHandleIfShow(false); + setFunctionHandleEnaable(false); + if(!_tempSvg.isEmpty()) + m_pRender = new QSvgRenderer(_tempSvg); + if(!m_pRender){ + if(!m_mapSvg.isEmpty()) + loadSvg(m_mapSvg.first()); + } +} + ElectricFunctionModelSvgItem::~ElectricFunctionModelSvgItem() { if(m_pRender) delete m_pRender; } +ElectricFunctionModelSvgItem* ElectricFunctionModelSvgItem::clone() const +{ + return new ElectricFunctionModelSvgItem(*this); +} + QPainterPath ElectricFunctionModelSvgItem::shape() { QPainterPath path; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItem2wTransformer.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItem2wTransformer.cpp index d1714c2..2149982 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItem2wTransformer.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItem2wTransformer.cpp @@ -13,11 +13,22 @@ ElectricFunctionModelSvgItem2wTransformer::ElectricFunctionModelSvgItem2wTransfo initial(); } +ElectricFunctionModelSvgItem2wTransformer::ElectricFunctionModelSvgItem2wTransformer(const ElectricFunctionModelSvgItem2wTransformer& obj) + : ElectricFunctionModelSvgItem(obj) +{ + initial(); +} + ElectricFunctionModelSvgItem2wTransformer::~ElectricFunctionModelSvgItem2wTransformer() { } +ElectricFunctionModelSvgItem2wTransformer* ElectricFunctionModelSvgItem2wTransformer::clone() const +{ + return new ElectricFunctionModelSvgItem2wTransformer(*this); +} + void ElectricFunctionModelSvgItem2wTransformer::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItem3wTransformer.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItem3wTransformer.cpp index 51b6d30..065bdfa 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItem3wTransformer.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItem3wTransformer.cpp @@ -12,11 +12,22 @@ ElectricFunctionModelSvgItem3wTransformer::ElectricFunctionModelSvgItem3wTransfo initial(); } +ElectricFunctionModelSvgItem3wTransformer::ElectricFunctionModelSvgItem3wTransformer(const ElectricFunctionModelSvgItem3wTransformer& obj) + : ElectricFunctionModelSvgItem(obj) +{ + initial(); +} + ElectricFunctionModelSvgItem3wTransformer::~ElectricFunctionModelSvgItem3wTransformer() { } +ElectricFunctionModelSvgItem3wTransformer* ElectricFunctionModelSvgItem3wTransformer::clone() const +{ + return new ElectricFunctionModelSvgItem3wTransformer(*this); +} + void ElectricFunctionModelSvgItem3wTransformer::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemBus.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemBus.cpp index 8ebad78..9383734 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemBus.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemBus.cpp @@ -15,11 +15,22 @@ ElectricFunctionModelSvgItemBus::ElectricFunctionModelSvgItemBus(const QRect &re initial(); } +ElectricFunctionModelSvgItemBus::ElectricFunctionModelSvgItemBus(const ElectricFunctionModelSvgItemBus& obj) + : ElectricFunctionModelSvgItem(obj) +{ + initial(); +} + ElectricFunctionModelSvgItemBus::~ElectricFunctionModelSvgItemBus() { } +ElectricFunctionModelSvgItemBus* ElectricFunctionModelSvgItemBus::clone() const +{ + return new ElectricFunctionModelSvgItemBus(*this); +} + void ElectricFunctionModelSvgItemBus::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCB.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCB.cpp index 3a8aca1..a6aee7f 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCB.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCB.cpp @@ -14,11 +14,22 @@ ElectricFunctionModelSvgItemCB::ElectricFunctionModelSvgItemCB(const QRect &rect initial(); } +ElectricFunctionModelSvgItemCB::ElectricFunctionModelSvgItemCB(const ElectricFunctionModelSvgItemCB& obj) + : ElectricFunctionModelSvgItem(obj) +{ + initial(); +} + ElectricFunctionModelSvgItemCB::~ElectricFunctionModelSvgItemCB() { } +ElectricFunctionModelSvgItemCB* ElectricFunctionModelSvgItemCB::clone() const +{ + return new ElectricFunctionModelSvgItemCB(*this); +} + void ElectricFunctionModelSvgItemCB::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.cpp index 09796fc..1653b6d 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCT.cpp @@ -12,11 +12,23 @@ ElectricFunctionModelSvgItemCT::ElectricFunctionModelSvgItemCT(const QRect &rect initial(); } +ElectricFunctionModelSvgItemCT::ElectricFunctionModelSvgItemCT(const ElectricFunctionModelSvgItemCT& obj) + : ElectricFunctionModelSvgItem(obj) +{ + initial(); + _itemType = obj._itemType; +} + ElectricFunctionModelSvgItemCT::~ElectricFunctionModelSvgItemCT() { } +ElectricFunctionModelSvgItemCT* ElectricFunctionModelSvgItemCT::clone() const +{ + return new ElectricFunctionModelSvgItemCT(*this); +} + void ElectricFunctionModelSvgItemCT::initial() { setFlag(QGraphicsItem::ItemIsSelectable, false); diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableEnd.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableEnd.cpp index 389c2c9..ff16a42 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableEnd.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableEnd.cpp @@ -13,11 +13,22 @@ ElectricFunctionModelSvgItemCableEnd::ElectricFunctionModelSvgItemCableEnd(const initial(); } +ElectricFunctionModelSvgItemCableEnd::ElectricFunctionModelSvgItemCableEnd(const ElectricFunctionModelSvgItemCableEnd& obj) + : ElectricFunctionModelSvgItem(obj) +{ + initial(); +} + ElectricFunctionModelSvgItemCableEnd::~ElectricFunctionModelSvgItemCableEnd() { } +ElectricFunctionModelSvgItemCableEnd* ElectricFunctionModelSvgItemCableEnd::clone() const +{ + return new ElectricFunctionModelSvgItemCableEnd(*this); +} + void ElectricFunctionModelSvgItemCableEnd::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableTer.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableTer.cpp index 9ca012a..0d9543e 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableTer.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemCableTer.cpp @@ -13,11 +13,22 @@ ElectricFunctionModelSvgItemCableTer::ElectricFunctionModelSvgItemCableTer(const initial(); } +ElectricFunctionModelSvgItemCableTer::ElectricFunctionModelSvgItemCableTer(const ElectricFunctionModelSvgItemCableTer& obj) + : ElectricFunctionModelSvgItem(obj) +{ + initial(); +} + ElectricFunctionModelSvgItemCableTer::~ElectricFunctionModelSvgItemCableTer() { } +ElectricFunctionModelSvgItemCableTer* ElectricFunctionModelSvgItemCableTer::clone() const +{ + return new ElectricFunctionModelSvgItemCableTer(*this); +} + void ElectricFunctionModelSvgItemCableTer::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemDS.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemDS.cpp index 68941e2..faca4b7 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemDS.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemDS.cpp @@ -13,11 +13,22 @@ ElectricFunctionModelSvgItemDS::ElectricFunctionModelSvgItemDS(const QRect &rect initial(); } +ElectricFunctionModelSvgItemDS::ElectricFunctionModelSvgItemDS(const ElectricFunctionModelSvgItemDS& obj) + : ElectricFunctionModelSvgItem(obj) +{ + initial(); +} + ElectricFunctionModelSvgItemDS::~ElectricFunctionModelSvgItemDS() { } +ElectricFunctionModelSvgItemDS* ElectricFunctionModelSvgItemDS::clone() const +{ + return new ElectricFunctionModelSvgItemDS(*this); +} + void ElectricFunctionModelSvgItemDS::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemDTEDS.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemDTEDS.cpp index 3f0fc10..611ecff 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemDTEDS.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemDTEDS.cpp @@ -13,11 +13,22 @@ ElectricFunctionModelSvgItemDTEDS::ElectricFunctionModelSvgItemDTEDS(const QRect inital(); } +ElectricFunctionModelSvgItemDTEDS::ElectricFunctionModelSvgItemDTEDS(const ElectricFunctionModelSvgItemDTEDS& obj) + : ElectricFunctionModelSvgItem(obj) +{ + inital(); +} + ElectricFunctionModelSvgItemDTEDS::~ElectricFunctionModelSvgItemDTEDS() { } +ElectricFunctionModelSvgItemDTEDS* ElectricFunctionModelSvgItemDTEDS::clone() const +{ + return new ElectricFunctionModelSvgItemDTEDS(*this); +} + void ElectricFunctionModelSvgItemDTEDS::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemES.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemES.cpp index e807d44..2910175 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemES.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemES.cpp @@ -13,11 +13,22 @@ ElectricFunctionModelSvgItemES::ElectricFunctionModelSvgItemES(const QRect &rect initial(); } +ElectricFunctionModelSvgItemES::ElectricFunctionModelSvgItemES(const ElectricFunctionModelSvgItemES& obj) + : ElectricFunctionModelSvgItem(obj) +{ + initial(); +} + ElectricFunctionModelSvgItemES::~ElectricFunctionModelSvgItemES() { } +ElectricFunctionModelSvgItemES* ElectricFunctionModelSvgItemES::clone() const +{ + return new ElectricFunctionModelSvgItemES(*this); +} + void ElectricFunctionModelSvgItemES::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemFES.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemFES.cpp index 689c425..7e3445f 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemFES.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemFES.cpp @@ -13,11 +13,22 @@ ElectricFunctionModelSvgItemFES::ElectricFunctionModelSvgItemFES(const QRect &re initial(); } +ElectricFunctionModelSvgItemFES::ElectricFunctionModelSvgItemFES(const ElectricFunctionModelSvgItemFES& obj) + :ElectricFunctionModelSvgItem(obj) +{ + initial(); +} + ElectricFunctionModelSvgItemFES::~ElectricFunctionModelSvgItemFES() { } +ElectricFunctionModelSvgItemFES* ElectricFunctionModelSvgItemFES::clone() const +{ + return new ElectricFunctionModelSvgItemFES(*this); +} + void ElectricFunctionModelSvgItemFES::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemImage.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemImage.cpp index e6c69c3..caed8c6 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemImage.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemImage.cpp @@ -14,11 +14,24 @@ ElectricFunctionModelSvgItemImage::ElectricFunctionModelSvgItemImage(const QRect initial(); } +ElectricFunctionModelSvgItemImage::ElectricFunctionModelSvgItemImage(const ElectricFunctionModelSvgItemImage& obj) + : ElectricFunctionModelSvgItem(obj) +{ + m_text = obj.m_text; + m_textColor = obj.m_textColor; + m_font = obj.m_font; +} + ElectricFunctionModelSvgItemImage::~ElectricFunctionModelSvgItemImage() { } +ElectricFunctionModelSvgItemImage* ElectricFunctionModelSvgItemImage::clone() const +{ + return new ElectricFunctionModelSvgItemImage(*this); +} + void ElectricFunctionModelSvgItemImage::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemLA.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemLA.cpp index ed56751..b0f6801 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemLA.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemLA.cpp @@ -13,11 +13,22 @@ ElectricFunctionModelSvgItemLA::ElectricFunctionModelSvgItemLA(const QRect &rect initial(); } +ElectricFunctionModelSvgItemLA::ElectricFunctionModelSvgItemLA(const ElectricFunctionModelSvgItemLA& obj) + : ElectricFunctionModelSvgItem(obj) +{ + initial(); +} + ElectricFunctionModelSvgItemLA::~ElectricFunctionModelSvgItemLA() { } +ElectricFunctionModelSvgItemLA* ElectricFunctionModelSvgItemLA::clone() const +{ + return new ElectricFunctionModelSvgItemLA(*this); +} + void ElectricFunctionModelSvgItemLA::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemPI.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemPI.cpp index 86c2e8e..fce34fd 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemPI.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemPI.cpp @@ -14,11 +14,22 @@ ElectricFunctionModelSvgItemPI::ElectricFunctionModelSvgItemPI(const QRect &rect initial(); } +ElectricFunctionModelSvgItemPI::ElectricFunctionModelSvgItemPI(const ElectricFunctionModelSvgItemPI& obj) + : ElectricFunctionModelSvgItem(obj) +{ + initial(); +} + ElectricFunctionModelSvgItemPI::~ElectricFunctionModelSvgItemPI() { } +ElectricFunctionModelSvgItemPI* ElectricFunctionModelSvgItemPI::clone() const +{ + return new ElectricFunctionModelSvgItemPI(*this); +} + void ElectricFunctionModelSvgItemPI::setImage_1(QFileInfo info) { QByteArray svgData; diff --git a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.cpp b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.cpp index e91ab9f..8e0a285 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/electricFunctionModelSvgItemPT.cpp @@ -12,11 +12,23 @@ ElectricFunctionModelSvgItemPT::ElectricFunctionModelSvgItemPT(const QRect &rect initial(); } +ElectricFunctionModelSvgItemPT::ElectricFunctionModelSvgItemPT(const ElectricFunctionModelSvgItemPT& obj) + : ElectricFunctionModelSvgItem(obj) +{ + initial(); + _itemType = obj._itemType; +} + ElectricFunctionModelSvgItemPT::~ElectricFunctionModelSvgItemPT() { } +ElectricFunctionModelSvgItemPT* ElectricFunctionModelSvgItemPT::clone() const +{ + return new ElectricFunctionModelSvgItemPT(*this); +} + void ElectricFunctionModelSvgItemPT::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { if(_curMonitorStateEnable){ diff --git a/diagramCavas/source/graphicsItem/functionModelItem/graphicsFunctionModelItem.cpp b/diagramCavas/source/graphicsItem/functionModelItem/graphicsFunctionModelItem.cpp index 80c610b..6889fda 100644 --- a/diagramCavas/source/graphicsItem/functionModelItem/graphicsFunctionModelItem.cpp +++ b/diagramCavas/source/graphicsItem/functionModelItem/graphicsFunctionModelItem.cpp @@ -13,10 +13,22 @@ GraphicsFunctionModelItem::GraphicsFunctionModelItem(QGraphicsItem *parent) m_eventExecutor = QSharedPointer(new EventExecutor()); } +GraphicsFunctionModelItem::GraphicsFunctionModelItem(const GraphicsFunctionModelItem& obj) + : GraphicsProjectModelItem(obj) + ,_pPropertyProxy(nullptr) +{ + //只做基本拷贝,用在预览显示 +} + GraphicsFunctionModelItem::~GraphicsFunctionModelItem() { } +GraphicsFunctionModelItem* GraphicsFunctionModelItem::clone() const +{ + return new GraphicsFunctionModelItem(*this); +} + QMap GraphicsFunctionModelItem::getMap() { QMap mapBool; diff --git a/diagramCavas/source/propertyDialog.cpp b/diagramCavas/source/propertyDialog.cpp index 7941159..a8180d6 100644 --- a/diagramCavas/source/propertyDialog.cpp +++ b/diagramCavas/source/propertyDialog.cpp @@ -4,6 +4,7 @@ PropertyDlg::PropertyDlg(QWidget *parent) : QDialog(parent) + ,_curWidget(nullptr) { setWindowTitle("属性显示"); setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint ); @@ -15,13 +16,17 @@ PropertyDlg::PropertyDlg(QWidget *parent) PropertyDlg::~PropertyDlg() { - + if(_curWidget) + removeContent(_curWidget); } void PropertyDlg::setContent(QWidget* content) { - if(content) - _layout->addWidget(content); + if(content){ + if(_layout->count() == 0) + _layout->addWidget(content); + _curWidget = content; + } } void PropertyDlg::removeContent(QWidget* content) diff --git a/diagramCavas/source/selectPanel.cpp b/diagramCavas/source/selectPanel.cpp new file mode 100644 index 0000000..aea31a1 --- /dev/null +++ b/diagramCavas/source/selectPanel.cpp @@ -0,0 +1,254 @@ +#include +#include "selectPanel.h" +#include +#include +#include "graphicsDataModel/fixedPortsModel.h" +#include "graphicsItem/graphicsBaseItem.h" +#include "util/selectorManager.h" +#include "powerEntity.h" +#include "topologyManager.h" +#include "baseProperty.h" +#include "graphicsItem/electricBayItem.h" +#include "statusBar.h" +#include "graphicsItem/functionModelItem/graphicsFunctionModelItem.h" + +SelectPanel::SelectPanel(PowerEntity* pEntity,QWidget *parent,DiagramMode mode) + : BaseDrawingPanel(pEntity,parent,mode) +{ + m_pStatusBar->setButtonVisible(false); + _pModel->setPanelMode(1); //设置为预览模式 +} + +SelectPanel::~SelectPanel() +{ + +} + +QJsonObject SelectPanel::getDiagramInfo() +{ + QJsonObject obj; + QJsonArray arr; + if(_pModel) + { + QMap map = _pModel->allNodePos(); + for(auto iter = map.begin();iter != map.end();++iter) + { + QJsonObject node; + node["id"] = iter.key().toString(); + node["x"] = iter.value().pos.x(); + node["y"] = iter.value().pos.y(); + node["width"] = iter.value().dWidth; + node["height"] = iter.value().dHeight; + node["rotate"] = iter.value().dRotate; + arr.append(node); + } + obj["nodes"] = arr; + + QJsonArray arrConnect; + QVector vec = _pModel->allConnectionProperty(); + for(auto& pPro:vec){ + Connection con = pPro->getConnection(); + QJsonObject connect; + connect["id"] = pPro->uuid().toString(); + connect["SrcNodeId"] = con.nSrcNodeId.toString(); + connect["SrcPortId"] = con.nSrcPortId.toString(); + connect["DestNodeId"] = con.nDestNodeId.toString(); + connect["DestPortId"] = con.nDestPortId.toString(); + arrConnect.append(connect); + } + obj["connections"] = arrConnect; + + QJsonArray arrBay; + QMap mapBay = _pModel->allBayItem(); + for(auto& bayItem:mapBay){ + AbstractProperty* pPro = bayItem->getProperty(); + BayProperty* pBay = dynamic_cast(pPro); + if(pBay) + { + QJsonObject bay; + bay["id"] = pBay->uuid().toString(); + arrBay.append(bay); + } + } + obj["bays"] = arrBay; + } + return obj; +} + +void SelectPanel::loadNodes(QJsonObject obj) +{ + QJsonArray nodesJsonArray = obj["nodes"].toArray(); + + QList> lst; + for (QJsonValueRef nodeJson : nodesJsonArray) + { + QJsonObject node = nodeJson.toObject(); + QString uuid = node["id"].toString(); + double dX = node["x"].toDouble(); + double dY = node["y"].toDouble(); + double dWidth = node["width"].toDouble(); + double dHeight = node["height"].toDouble(); + double dRotate = node["rotate"].toDouble(); + + if(_pModel) + { + auto pItem = _pModel->addNodeItem(QUuid(uuid),QPointF(dX,dY),dWidth,dHeight,dRotate); + if(pItem){ + lst.append(qMakePair(pItem->getName(),QUuid(uuid))); + } + } + } + + QJsonArray connectArr = obj["connections"].toArray(); + for(QJsonValueRef connectJson:connectArr) + { + QJsonObject connect = connectJson.toObject(); + QUuid id = QUuid(connect["id"].toString()); //电缆线id,关联component中的电缆 + QUuid srcId = QUuid(connect["SrcNodeId"].toString()); + QUuid srcPortId = QUuid(connect["SrcPortId"].toString()); + QUuid destId = QUuid(connect["DestNodeId"].toString()); + QUuid destPortId = QUuid(connect["DestPortId"].toString()); + + PowerConnection* pCon = TopologyManager::instance().connection(srcPortId.toString(),destPortId.toString()); + if(pCon) + { + pCon->setId(id.toString()); + QString srcItemId = pCon->fromComponent(); + QString destItemId = pCon->toComponent(); + //todo:从拓扑结构中查找port的id + if(_pModel) + { + QString sName = _pModel->addConnectLline(id,QUuid(srcItemId),QUuid(destItemId),srcPortId,destPortId); + if(sName != "err"){ + lst.append(qMakePair(sName,QUuid(id))); + } + } + } + else + { + //todo:提示拓扑结构已改变 + } + } + + QJsonArray bayArr = obj["bays"].toArray(); + for(QJsonValueRef bayJson:bayArr) + { + QJsonObject bay = bayJson.toObject(); + QUuid id = QUuid(bay["id"].toString()); + if(_pModel) + { + _pModel->addBayItem(id); + } + } + + if(_pModel){ + QString sG; + QString sZ; + QString sS; + for(auto& pBaseItem:_pModel->allItems()) //取grid_zone_station(间隔不含这些内容) + { + BaseProperty* pBase = dynamic_cast(pBaseItem->getProperty()); + if(sG.isEmpty()) + sG = pBase->grid(); + if(sZ.isEmpty()) + sZ = pBase->zone(); + if(sS.isEmpty()) + sS = pBase->station(); + break; + } + + QList lstFirst; + + for(auto& pOtherItem:_pModel->getProjectBayItems()) + { + BayProperty* pBay = dynamic_cast(pOtherItem->getProperty()); + if(pBay){ + // 创建间隔项 + HierarchyItem bayInfo; + bayInfo.item.nEquipType = 0; // 间隔的设备类型为0 + bayInfo.item.nCategory = 1; // 类别为1表示间隔 + bayInfo.item.sName = pBay->tag(); + bayInfo.item.uid = pBay->uuid(); + bayInfo.item.sVoltageLevel = QString::number(pBay->getVoltage()); + bayInfo.item.grid = sG; + bayInfo.item.zone = sZ; + bayInfo.item.station = sS; + + lstFirst.append(bayInfo); + } + } + + emit _pModel->updateCurrentItems(lstFirst, true); + emit _pModel->updateTopologyItems(lstFirst, true,true); + + // 第二阶段:处理所有设备 + QList lstSecond; + + // 建立间隔UUID到间隔标签的映射,提高查找效率 + QHash bayUuidToTag; + for(auto& pOtherItem:_pModel->getProjectBayItems()) + { + BayProperty* pBay = dynamic_cast(pOtherItem->getProperty()); + if(pBay){ + bayUuidToTag[pBay->uuid().toString()] = pBay->tag(); + } + } + + for(auto& pBaseItem:_pModel->allItems()) + { + BaseProperty* pBase = dynamic_cast(pBaseItem->getProperty()); + + HierarchyItem info; + info.item.nEquipType = pBase->type(); + info.item.nCategory = 0; // 类别为0表示设备 + info.item.sName = pBase->name(); + info.item.uid = pBase->uuid(); + + // 查找设备所属的间隔 + QString bayTag; + QString bayUuid; + QString sVoltage; + + // 通过间隔标签直接查找 + bayTag = pBase->getBay(); + + // 如果需要间隔UUID,可以反向查找 + if(!bayTag.isEmpty()){ + for(auto& pOtherItem:_pModel->getProjectBayItems()){ + BayProperty* pBay = dynamic_cast(pOtherItem->getProperty()); + if(pBay && pBay->tag() == bayTag){ + bayUuid = pBay->uuid().toString(); + sVoltage = QString::number(pBay->getVoltage()); + break; + } + } + } + + if(!bayTag.isEmpty()){ + // 设置父间隔信息 + info.parent.nEquipType = 0; + info.parent.nCategory = 1; + info.parent.sName = bayTag; + info.parent.uid = QUuid(bayUuid); + info.parent.sVoltageLevel = sVoltage; + info.parent.grid = sG; + info.parent.zone = sZ; + info.parent.station = sS; + } + + lstSecond.append(info); + } + + emit _pModel->updateCurrentItems(lstSecond, false); + emit _pModel->updateTopologyItems(lstSecond, false,true); + } +} + +void SelectPanel::clearItems() +{ + if(_pModel){ + _pModel->getScene()->clear(); + _pModel->allItems().clear(); + _pModel->getProjectBayItems().clear(); + } +} diff --git a/diagramCavas/source/util/baseSelector.cpp b/diagramCavas/source/util/baseSelector.cpp index 38b9d78..7730b7c 100644 --- a/diagramCavas/source/util/baseSelector.cpp +++ b/diagramCavas/source/util/baseSelector.cpp @@ -276,6 +276,34 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen view->setDragMode(QGraphicsView::RubberBandDrag); } } + else if(sceneMode == DM_customHMI){ + QList items = scene->selectedItems(); + if(items.count() != 0){ + for(auto& pI:items){ + GraphicsFunctionModelItem* item = qgraphicsitem_cast(pI); + if(item) + item->setSelected(true); + } + + QPointF pos = event->scenePos(); + for (QGraphicsItem* item : scene->items()) { //检测间隔 + ElectricBayItem* pItem = dynamic_cast(item); + if (pItem) { + if(pItem->containsPoint(pos)){ + // 处理命中 + pItem->setSelected(true); + } + } + } + } + m_opMode = OM_none; + if(m_opMode == OM_none) + { + QGraphicsView *view = scene->getView(); + if(view) + view->setDragMode(QGraphicsView::RubberBandDrag); + } + } } void BaseSelector::mouseMoveEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene,DiagramMode sceneMode) @@ -533,6 +561,40 @@ void BaseSelector::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, DesignerSc ms_nDragHandle = H_none; scene->callParentEvent(event); } + else if(sceneMode == DM_customHMI) + { + QList lst; //发送已选中的元件 + QList items = scene->selectedItems(); + for(auto& pItem:items){ + GraphicsFunctionModelItem* item = dynamic_cast(pItem); + if(item){ + HierarchyItem info; + auto pPro = item->getProperty(); + if(pPro){ + info.item.nCategory = 0; + info.item.nEquipType = pPro->type(); + info.item.sName = pPro->name(); + info.item.uid = pPro->uuid(); + lst.append(info); + } + } + else{ + GraphicsNonStandardItem* bay = dynamic_cast(pItem); + if(bay){ + HierarchyItem info; + auto pBayPro = bay->getProperty(); + if(pBayPro){ + info.item.nCategory = 1; + info.item.nEquipType = 0; + info.item.sName = pBayPro->name(); + info.item.uid = pBayPro->uuid(); + lst.append(info); + } + } + } + } + emit _model->itemSelected(lst); + } } void BaseSelector::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event, DesignerScene* scene,DiagramMode sceneMode) diff --git a/diagramCavas/ui/createHMIdlg.ui b/diagramCavas/ui/createHMIdlg.ui index e38245b..10e1a93 100644 --- a/diagramCavas/ui/createHMIdlg.ui +++ b/diagramCavas/ui/createHMIdlg.ui @@ -97,6 +97,81 @@ QWidget QLabel { 15 + + + + 导入: + + + + + + + + + + + + + + + + + 60 + 0 + + + + + 100 + 16777215 + + + + QPushButton { + background-color: #5a79a1; /* 中性灰蓝,不刺眼 */ + color: white; + border: none; /* 无边框,扁平化 */ + border-radius: 4px; /* 小圆角,扁平感 */ + font-size: 13px; /* 适中字号 */ + font-weight: 500; /* 中等字重 */ +} + +QPushButton:hover { + background-color: #4a5d7e; /* 稍深的灰蓝 */ +} + +QPushButton:pressed { + background-color: #3d4e6b; /* 更深的灰蓝 */ +} + +QPushButton:disabled { + background-color: #a0b3d1; /* 灰调的浅蓝 */ + color: #d1dce9; /* 浅灰色文字 */ +} + + + + 自定义导入 + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + @@ -135,39 +210,7 @@ QWidget QLabel { - - - - 导入: - - - - - - - Qt::Orientation::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - - - - + diff --git a/diagramCavas/ui/customHMIGenerateDlg.ui b/diagramCavas/ui/customHMIGenerateDlg.ui new file mode 100644 index 0000000..d483838 --- /dev/null +++ b/diagramCavas/ui/customHMIGenerateDlg.ui @@ -0,0 +1,394 @@ + + + customHMIGenerateDlg + + + + 0 + 0 + 935 + 667 + + + + + 12 + + + + Dialog + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 16777215 + 21 + + + + QWidget { + background: #2c5282; + color: white; + border: none; +} + +QWidget QLabel { + color: white; + font-size: 12px; + background: transparent; +} + + + + 0 + + + 0 + + + + + + + + 自定义生成 + + + + + + + Qt::Orientation::Horizontal + + + + 586 + 6 + + + + + + + + + + + 系统图工作区 + + + + + + + 对象列表 + + + + + + + 效果预览 + + + + + + + 控制面板 + + + + 4 + + + 6 + + + 6 + + + 6 + + + 6 + + + + + + + 布局模式 + + + + + + + 相对位置 + + + + + + + 自动优化 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Orientation::Horizontal + + + + + + + + + HMI名称 + + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + 尺寸 + + + + + + + + 90 + 0 + + + + + 1920*1080 + + + + + 1600*1200 + + + + + 1280*960 + + + + + 800*600 + + + + + 400*300 + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + 60 + 0 + + + + QPushButton { + background-color: #5a79a1; /* 中性灰蓝,不刺眼 */ + color: white; + border: none; /* 无边框,扁平化 */ + border-radius: 4px; /* 小圆角,扁平感 */ + font-size: 13px; /* 适中字号 */ + font-weight: 500; /* 中等字重 */ +} + +QPushButton:hover { + background-color: #4a5d7e; /* 稍深的灰蓝 */ +} + +QPushButton:pressed { + background-color: #3d4e6b; /* 更深的灰蓝 */ +} + +QPushButton:disabled { + background-color: #a0b3d1; /* 灰调的浅蓝 */ + color: #d1dce9; /* 浅灰色文字 */ +} + + + + 返回 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + 60 + 0 + + + + QPushButton { + background-color: #5a79a1; /* 中性灰蓝,不刺眼 */ + color: white; + border: none; /* 无边框,扁平化 */ + border-radius: 4px; /* 小圆角,扁平感 */ + font-size: 13px; /* 适中字号 */ + font-weight: 500; /* 中等字重 */ +} + +QPushButton:hover { + background-color: #4a5d7e; /* 稍深的灰蓝 */ +} + +QPushButton:pressed { + background-color: #3d4e6b; /* 更深的灰蓝 */ +} + +QPushButton:disabled { + background-color: #a0b3d1; /* 灰调的浅蓝 */ + color: #d1dce9; /* 浅灰色文字 */ +} + + + + 生成 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + diff --git a/diagramUtils/source/logger.cpp b/diagramUtils/source/logger.cpp index 9b9c8e8..b3e48dc 100644 --- a/diagramUtils/source/logger.cpp +++ b/diagramUtils/source/logger.cpp @@ -36,34 +36,27 @@ void Logger::initialize() void Logger::loadConfig(/*const QString& configFilePath*/) { - //QString filePath = Settings::instance().value("Log", "logFile").toString(); QString filePath = QCoreApplication::applicationDirPath() + "/log/app.log"; + + // 确保日志目录存在 + QDir logDir(QFileInfo(filePath).absolutePath()); + if (!logDir.exists()) { + logDir.mkpath("."); // 创建目录 + } + + // 检查文件是否存在,不存在则创建 + QFile logFile(filePath); + if (!logFile.exists()) { + if (logFile.open(QIODevice::WriteOnly | QIODevice::Append)) { + logFile.close(); + } else { + // 处理创建失败的情况 + qWarning() << "Failed to create log file:" << filePath; + } + } + setLogFile(filePath); - /*QString strLevel = Settings::instance().value("Log", "level").toString().toUpper(); - if(strLevel == "DEBUG") - m_logLevel = DEBUG; - else if(strLevel == "INFO") - m_logLevel = INFO; - else if(strLevel == "WARNING") - m_logLevel = WARNING; - else if(strLevel == "ERROR") - m_logLevel = ERROR; - else if(strLevel == "FATAL") - m_logLevel = FATAL; - - m_maxFileSize = Settings::instance().value("Log", "maxSize").toLongLong(); - m_maxBackupFiles = Settings::instance().value("Log", "backups").toInt(); - QString strOutputToConsole = Settings::instance().value("Log", "consoleOutput").toString(); - if(strOutputToConsole == "true") - m_outputToConsole = true; - else - m_outputToConsole = false; - QString strOutputToFile = Settings::instance().value("Log", "fileOutput").toString(); - if(strOutputToFile == "true") - m_outputOtFile = true; - else - m_outputOtFile = false;*/ } void Logger::setLogFile(const QString& filePath) diff --git a/include/mainwindow.h b/include/mainwindow.h index a27ac2d..fe25c07 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -23,6 +23,7 @@ class MonitorItemsDlg; class MonitorPagesDlg; class QDetailsView; class RuntimeDialog; +class QQuickWidget; class CMainWindow : public QMainWindow { @@ -52,6 +53,7 @@ private slots: void onSignal_deleteItem(); void onCavasItemSelected(QObject*); + void clearPropertySelection(); public: GraphicElementsPanel* graphicsElementsPanel() const; void setMode(int nMode = 0); //切换模式 diff --git a/include/runtimeDialog.h b/include/runtimeDialog.h index 2f38e19..c2ed0fd 100644 --- a/include/runtimeDialog.h +++ b/include/runtimeDialog.h @@ -11,12 +11,15 @@ public: RuntimeDialog(QWidget* parent = nullptr); void setContent(QWidget* content); + void removeContent(QWidget* content); + QWidget* content() {return _pContent;} signals: void exitRuntime(); protected: void keyPressEvent(QKeyEvent* event) override; private: QVBoxLayout* _layout; + QWidget* _pContent; }; #endif //RUNTIMEDIALOG_H diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index 2da42b7..eed9923 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include "diagramCavas.h" #include "graphicElementsPanel.h" @@ -62,6 +64,8 @@ CMainWindow::~CMainWindow() delete pView; delete m_pPropertiesEditorView; } + if(m_pRuntimeDlg) + delete m_pRuntimeDlg; } @@ -136,9 +140,10 @@ void CMainWindow::initializeDockUi() this->setCentralWidget(m_pDiagramCavas); connect(m_pElectricElementsBox,&ElectricElementsBox::addEletricItem,m_pDiagramCavas,&DiagramCavas::onSignal_addGraphicsItem); - m_pRuntimeDlg = new RuntimeDialog(this); + m_pRuntimeDlg = new RuntimeDialog(); m_pRuntimeDlg->hide(); connect(m_pRuntimeDlg,&RuntimeDialog::exitRuntime,this,[&](){ + //m_pDiagramCavas->onTargetSelected(new QObject(m_pDiagramCavas)); setMode(0); }); @@ -193,6 +198,7 @@ void CMainWindow::initializeAction() connect(m_pDiagramView,&DiagramView::prepareCreateHMI,m_pDiagramCavas,&DiagramCavas::onCreateHMIClicked); connect(m_pDiagramCavas,&DiagramCavas::createHMI,m_pDiagramView,&DiagramView::onNewHMICreated); connect(m_pDiagramCavas,&DiagramCavas::updateHMI,m_pDiagramView,&DiagramView::onHMIUpdated); + connect(m_pDiagramCavas, &DiagramCavas::clearSelection,this, &CMainWindow::clearPropertySelection); //connect(m_pDiagramCavas,&DiagramCavas::prepareUpdateItems,m_pMonitorItemsDlg,&MonitorItemsDlg::onUpdateItems); //connect(m_pDiagramCavas,&DiagramCavas::prepareSelectItems,m_pMonitorItemsDlg,&MonitorItemsDlg::onSelectItems); @@ -213,6 +219,7 @@ void CMainWindow::initializeAction() actRun->setShortcut(QKeySequence(Qt::Key_F5)); //connect(actRun,&QAction::triggered,m_pDiagramCavas,&DiagramCavas::onSignal_runPage); connect(actRun,&QAction::triggered,this,[&](){ + //m_pDiagramCavas->onTargetSelected(new QObject(m_pDiagramCavas)); setMode(1); }); @@ -249,18 +256,25 @@ void CMainWindow::initializeAction() void CMainWindow::refreshLayout() { - if(_nMode == 0){ //编辑模式 + if (_nMode == 0) { // 编辑模式 m_pRuntimeDlg->hide(); + m_pRuntimeDlg->removeContent(m_pDiagramCavas); + this->show(); this->setCentralWidget(m_pDiagramCavas); } - else{ + else { // 运行模式 + if (centralWidget() == m_pDiagramCavas) { + this->takeCentralWidget(); + } this->hide(); + m_pRuntimeDlg->setContent(m_pDiagramCavas); - m_pRuntimeDlg->showMaximized(); + m_pRuntimeDlg->show(); } } + void CMainWindow::onAction_zoomIn() { //m_pDrawingPanel->grahpicsViewZoomIn(); @@ -342,6 +356,13 @@ void CMainWindow::onCavasItemSelected(QObject* obj) } +void CMainWindow::clearPropertySelection() +{ + if (m_pPropertiesEditorView) { + m_pPropertiesEditorView->setObject(new QObject(this)); + } +} + GraphicElementsPanel* CMainWindow::graphicsElementsPanel() const { if(m_pGraphicElementsPanel) @@ -357,12 +378,8 @@ void CMainWindow::setMode(int nMode) { if(_nMode != nMode){ _nMode = nMode; - m_pPropertyEditorDock->setWidget(nullptr); m_pDiagramCavas->setCurMode(nMode); } - if(_nMode == 0){ - m_pPropertyEditorDock->setWidget(m_pPropertiesEditorView); //属性页设置回主界面 - } refreshLayout(); } diff --git a/source/runtimeDialog.cpp b/source/runtimeDialog.cpp index 2fdfa1f..92a94cc 100644 --- a/source/runtimeDialog.cpp +++ b/source/runtimeDialog.cpp @@ -3,7 +3,8 @@ #include RuntimeDialog::RuntimeDialog(QWidget *parent) - : QDialog(parent,Qt::FramelessWindowHint) + : QDialog(parent) + ,_pContent(nullptr) { _layout = new QVBoxLayout(this); _layout->setContentsMargins(0, 0, 0, 0); @@ -20,4 +21,13 @@ void RuntimeDialog::setContent(QWidget* content) { if(content) _layout->addWidget(content); + _pContent = content; +} + +void RuntimeDialog::removeContent(QWidget* content) +{ + if(content){ + if(_layout->count()) + _layout->removeWidget(content); + } }