add custom HMI generate UI

This commit is contained in:
baiYue 2026-04-24 17:14:45 +08:00
parent efa6593a17
commit 8b5be362ae
81 changed files with 1996 additions and 195 deletions

View File

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

View File

@ -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__

View File

@ -4,63 +4,64 @@
#include <QQmlEngine>
#include <QQuickItem>
#include <QUrl>
#include <QTimer>
#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<QQuickItem*>(rootObject);
if (rootItem) {
mQuickWidget->setContent(QUrl(), &component, rootItem);
mQuickDetailsView = qobject_cast<QQuickDetailsView*>(rootItem);
}
}
QQuickItem* rootItem = qobject_cast<QQuickItem*>(rootObject);
if (rootItem) {
mQuickWidget->setContent(QUrl(), &component, rootItem);
mQuickDetailsView = qobject_cast<QQuickDetailsView*>(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<QObject*>(nullptr);
rootObject->setProperty("Object", emptyVar);
return;
}
// 设置普通对象
rootObject->setProperty("Object", QVariant::fromValue(inObject));
}
QObject* QDetailsView::getObject() const

View File

@ -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<QPropertyHandle*>(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;

View File

@ -93,7 +93,9 @@ enum DiagramMode {
DM_edit = 0,
DM_run,
DM_academic,
DM_baseModel
DM_baseModel,
DM_customHMI,
DM_previewHMI
};
//端口类型

View File

@ -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 "" # DLLlib
OUTPUT_NAME "diagramCavas" # DLL
IMPORT_PREFIX "lib" # lib
IMPORT_SUFFIX ".dll.a" #
)

View File

@ -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;
};

View File

@ -0,0 +1,41 @@
#ifndef CUSTOMHMICREATEDLG_H
#define CUSTOMHMICREATEDLG_H
#include <QDialog>
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<HierarchyItem>);
private:
Ui::customHMIGenerateDlg *ui;
SelectPanel* _pOperatePanel; //操作界面
SelectPanel* _pPreviewPanel; //预览界面
PowerEntity* _pPe;
PowerEntity* _pOe;
DiagramCavas* _pCanvas = nullptr;
CustomHMIList* _pItemList;
};
#endif

View File

@ -0,0 +1,44 @@
#ifndef CUSTOMHMILIST_H
#define CUSTOMHMILIST_H
/******************自定义创建HMI时的list******************/
#include <QWidget>
#include <QTreeView>
#include <QStandardItem>
#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<HierarchyItem>); //生成监控
public slots:
void onUpdateItems(QList<HierarchyItem>,bool refresh); //更新当前设备列表
void onSelectItems(QList<HierarchyItem>); //更新当前选中的设备
void onMonitorCreated(QList<HierarchyItem>); //创建后的设备列表
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<QStandardItem*> getCheckedItems(QStandardItem* parentItem); //返回checked对象
QList<QStandardItem*> getTreeViewCheckedItems(QTreeView* treeView); //返回checked对象
// 查找间隔节点
QStandardItem* findBayItem(const QString& bayName);
private:
QTreeView* _tree;
QStandardItemModel* _modelAll; //图中所有item
// 存储间隔名称到树节点的映射,提高查找效率
QHash<QString, QStandardItem*> m_mapBayItems;
};
#endif

View File

@ -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&);

View File

@ -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<QString, PluginTypeInfo> 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(); // 显示属性页

View File

@ -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<MonitorItemTypeStruct,QMap<MonitorItemStateStruct,MonitorItemDisplayInfo>> map){m_monitorDisplaySetting = map;}
QMap<MonitorItemTypeStruct,QMap<MonitorItemStateStruct,MonitorItemDisplayInfo>>& getMonitorDisplaySetting(){return m_monitorDisplaySetting;}
void previewHMI(SelectPanel* pPreview,QList<HierarchyItem>); //customHMI 生成预览
QList<HMIImageRef>& getHMIimageRef(){return _HMIimageRef;}
QList<HMICustomImageRef>& getHMICustomImageRef(){return _HMICustomImageRef;}
int imageRefExist(QString model,QByteArray hash256);
@ -154,9 +156,12 @@ public:
void setCavas(QPointer<DiagramCavas> p) {_cavas = p;} //设置所属顶层容器
DiagramCavas* getCavas();
int getCurMode(); //获取当前模式
void clearCurItems(); //清空当前item
void setPanelMode(int n) {_panelMode = n;}
int getPanelMode(){return _panelMode;}
QMap<QUuid,GraphicsFunctionModelItem*> getHMIItems(){return _nodeItem;}
QMap<QUuid,ElectricBayItem*> getProjectBayItems(){return _bayItem;}
QMap<QUuid,GraphicsFunctionModelItem*>& getHMIItems(){return _nodeItem;}
QMap<QUuid,ElectricBayItem*>& getProjectBayItems(){return _bayItem;}
QMap<QUuid,GraphicsFunctionModelItem*> getGraphicItems(){return _graphicItem;}
void setPageState(int n) {_pageState = n;}
@ -215,6 +220,7 @@ private:
QList<HMIImageRef> _HMIimageRef; //当前HMI中图片的引用关系
QList<HMICustomImageRef> _HMICustomImageRef; //当前HMI中图片项的引用
QMap<QUuid, QMap<QString, bool*>> _mapSelectedRefs; //item属性可见性(属性栏使用)
int _panelMode = 0; //当前panel模式0普通 1预览
public:
static bool _dataInitialised;
};

View File

@ -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:

View File

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

View File

@ -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;}

View File

@ -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:

View File

@ -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;

View File

@ -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;}

View File

@ -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;

View File

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

View File

@ -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;

View File

@ -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;

View File

@ -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:

View File

@ -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;

View File

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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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<QString,bool> getMap(); //bool值为数据源指针类型
void setMap(QMap<QString,bool>);

View File

@ -17,10 +17,9 @@
#include <QJsonObject>
#include <QFileInfo>
#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<QGraphicsItem>(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<QString,HandleText*> getDynamicText() {return m_mapDynamicText;}
void setHandle(FixedPortsModel* p){_pHandle = p;}
FixedPortsModel* getHandle() {return _pHandle;}
void setHandle(QPointer<FixedPortsModel> 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<QRectF> getAllComponentRects() const; //获取图所有碰撞矩形
QList<QPainterPath> getObstacleShapes() const; //获取所有碰撞shape
protected:
FixedPortsModel* _pHandle;
QPointer<FixedPortsModel> _pHandle;
ModelProperty* _property;
PowerEntity* _pEntity; //图元拓扑
bool _itemChanged; //图元变化标志,判断是否需要保存

View File

@ -16,6 +16,7 @@ public:
void removeContent(QWidget* content);
private:
QVBoxLayout* _layout;
QWidget* _curWidget;
};
#endif

View File

@ -0,0 +1,24 @@
#ifndef SELECTPANEL_H
#define SELECTPANEL_H
#include <QWidget>
#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

View File

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

View File

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

View File

@ -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 <QVBoxLayout>
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<DiagramCavas*>(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<DiagramCavas>(_pCanvas));
QVBoxLayout *layPreview= new QVBoxLayout(ui->gb_preview);
layPreview->addWidget(_pPreviewPanel);
_pPreviewPanel->getModelController()->setCavas(QPointer<DiagramCavas>(_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<HierarchyItem> lst)
{
_pPreviewPanel->clearItems();
_pOperatePanel->getModelController()->previewHMI(_pPreviewPanel,lst);
}

View File

@ -0,0 +1,252 @@
#include "customHMIList.h"
#include <QToolTip>
#include <QVBoxLayout>
#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<HierarchyItem> 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<HierarchyItem> 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<HierarchyItem> lst;
QList<QStandardItem*> 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<HierarchyItem> 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<QStandardItem*> CustomHMIList::getCheckedItems(QStandardItem* parentItem) {
QList<QStandardItem*> 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<QStandardItem*> CustomHMIList::getTreeViewCheckedItems(QTreeView* treeView) {
QList<QStandardItem*> checkedItems;
QStandardItemModel* model = qobject_cast<QStandardItemModel*>(treeView->model());
if (!model) return checkedItems;
QStandardItem* rootItem = model->invisibleRootItem();
return getCheckedItems(rootItem);
}
void CustomHMIList::resetSelect()
{
traverseSelectStandardItemModel(_modelAll,Qt::Unchecked);
}

View File

@ -1,5 +1,4 @@
#include "designerView.h"
#include "designerScene.h"
#include <QMouseEvent>
#define MAX_ZoomValue 50.0

View File

@ -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<DrawingPanel*>(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<QUuid> lst)

View File

@ -18,6 +18,7 @@
#include <QMetaMethod>
#include <QApplication>
#include <QShortcut>
#include <QHBoxLayout>
#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<PageInfo> 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<QWidget*>(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<HMIPageInfo> 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;
}

View File

@ -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<QGraphicsItem*> 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<HierarchyItem> lst)
{
if(_cavas){
pPanel->getModelController()->setMonitorRelation(lst);
QList<HierarchyItem> lstFirst;
QList<HierarchyItem> 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<BayProperty*>(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<BaseProperty*>(pItem->getProperty());
if(pPro){
auto pNewItem = pItem->clone();
if(pPro->type() == 8){
auto pLine = dynamic_cast<ElectricFunctionModelConnectLineItem*>(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)

View File

@ -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(); // 通知框架几何变化

View File

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

View File

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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

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

View File

@ -13,10 +13,22 @@ GraphicsFunctionModelItem::GraphicsFunctionModelItem(QGraphicsItem *parent)
m_eventExecutor = QSharedPointer<EventExecutor>(new EventExecutor());
}
GraphicsFunctionModelItem::GraphicsFunctionModelItem(const GraphicsFunctionModelItem& obj)
: GraphicsProjectModelItem(obj)
,_pPropertyProxy(nullptr)
{
//只做基本拷贝,用在预览显示
}
GraphicsFunctionModelItem::~GraphicsFunctionModelItem()
{
}
GraphicsFunctionModelItem* GraphicsFunctionModelItem::clone() const
{
return new GraphicsFunctionModelItem(*this);
}
QMap<QString,bool> GraphicsFunctionModelItem::getMap()
{
QMap<QString,bool> mapBool;

View File

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

View File

@ -0,0 +1,254 @@
#include <QJsonArray>
#include "selectPanel.h"
#include <QMessageBox>
#include <QCloseEvent>
#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<QUuid,ItemPageInfo> 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<ModelProperty*> 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<QUuid,ElectricBayItem*> mapBay = _pModel->allBayItem();
for(auto& bayItem:mapBay){
AbstractProperty* pPro = bayItem->getProperty();
BayProperty* pBay = dynamic_cast<BayProperty*>(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<QPair<QString,QUuid>> 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<BaseProperty*>(pBaseItem->getProperty());
if(sG.isEmpty())
sG = pBase->grid();
if(sZ.isEmpty())
sZ = pBase->zone();
if(sS.isEmpty())
sS = pBase->station();
break;
}
QList<HierarchyItem> lstFirst;
for(auto& pOtherItem:_pModel->getProjectBayItems())
{
BayProperty* pBay = dynamic_cast<BayProperty*>(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<HierarchyItem> lstSecond;
// 建立间隔UUID到间隔标签的映射提高查找效率
QHash<QString, QString> bayUuidToTag;
for(auto& pOtherItem:_pModel->getProjectBayItems())
{
BayProperty* pBay = dynamic_cast<BayProperty*>(pOtherItem->getProperty());
if(pBay){
bayUuidToTag[pBay->uuid().toString()] = pBay->tag();
}
}
for(auto& pBaseItem:_pModel->allItems())
{
BaseProperty* pBase = dynamic_cast<BaseProperty*>(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<BayProperty*>(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();
}
}

View File

@ -276,6 +276,34 @@ void BaseSelector::mousePressEvent(QGraphicsSceneMouseEvent* event, DesignerScen
view->setDragMode(QGraphicsView::RubberBandDrag);
}
}
else if(sceneMode == DM_customHMI){
QList<QGraphicsItem *> items = scene->selectedItems();
if(items.count() != 0){
for(auto& pI:items){
GraphicsFunctionModelItem* item = qgraphicsitem_cast<GraphicsFunctionModelItem*>(pI);
if(item)
item->setSelected(true);
}
QPointF pos = event->scenePos();
for (QGraphicsItem* item : scene->items()) { //检测间隔
ElectricBayItem* pItem = dynamic_cast<ElectricBayItem*>(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<HierarchyItem> lst; //发送已选中的元件
QList<QGraphicsItem *> items = scene->selectedItems();
for(auto& pItem:items){
GraphicsFunctionModelItem* item = dynamic_cast<GraphicsFunctionModelItem*>(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<GraphicsNonStandardItem*>(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)

View File

@ -97,6 +97,81 @@ QWidget QLabel {
<property name="verticalSpacing">
<number>15</number>
</property>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>导入:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="cb_structure">
<item>
<property name="text">
<string>无</string>
</property>
</item>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="btn_custom">
<property name="minimumSize">
<size>
<width>60</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">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; /* 浅灰色文字 */
}
</string>
</property>
<property name="text">
<string>自定义导入</string>
</property>
</widget>
</item>
<item row="4" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit"/>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="cb_template">
<item>
@ -135,39 +210,7 @@ QWidget QLabel {
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>导入:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit"/>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="cb_structure">
<item>
<property name="text">
<string>无</string>
</property>
</item>
</widget>
</item>
<item row="4" column="1">
<item row="5" column="1">
<widget class="QLabel" name="label_info">
<property name="text">
<string/>

View File

@ -0,0 +1,394 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>customHMIGenerateDlg</class>
<widget class="QDialog" name="customHMIGenerateDlg">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>935</width>
<height>667</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QGridLayout" name="gridLayout" rowstretch="1,5,5,4" columnstretch="3,2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="0" colspan="2">
<widget class="QWidget" name="widget" native="true">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>21</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">QWidget {
background: #2c5282;
color: white;
border: none;
}
QWidget QLabel {
color: white;
font-size: 12px;
background: transparent;
}</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label">
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="text">
<string>自定义生成</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>586</width>
<height>6</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item row="1" column="0" rowspan="2">
<widget class="QGroupBox" name="gb_sys">
<property name="title">
<string>系统图工作区</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QGroupBox" name="gb_list">
<property name="title">
<string>对象列表</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QGroupBox" name="gb_preview">
<property name="title">
<string>效果预览</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QGroupBox" name="gb_command">
<property name="title">
<string>控制面板</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>4</number>
</property>
<property name="leftMargin">
<number>6</number>
</property>
<property name="topMargin">
<number>6</number>
</property>
<property name="rightMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>6</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>布局模式</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rb_origin">
<property name="text">
<string>相对位置</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rb_auto">
<property name="text">
<string>自动优化</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>HMI名称</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="le_hmiName"/>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>尺寸</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cb_size">
<property name="minimumSize">
<size>
<width>90</width>
<height>0</height>
</size>
</property>
<item>
<property name="text">
<string>1920*1080</string>
</property>
</item>
<item>
<property name="text">
<string>1600*1200</string>
</property>
</item>
<item>
<property name="text">
<string>1280*960</string>
</property>
</item>
<item>
<property name="text">
<string>800*600</string>
</property>
</item>
<item>
<property name="text">
<string>400*300</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btn_return">
<property name="minimumSize">
<size>
<width>60</width>
<height>0</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">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; /* 浅灰色文字 */
}
</string>
</property>
<property name="text">
<string>返回</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btn_generate">
<property name="minimumSize">
<size>
<width>60</width>
<height>0</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">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; /* 浅灰色文字 */
}
</string>
</property>
<property name="text">
<string>生成</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

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

View File

@ -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); //切换模式

View File

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

View File

@ -13,6 +13,8 @@
#include <QMessageBox>
#include <QVBoxLayout>
#include <QLibrary>
#include <QTimer>
#include <QThread>
#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();
}

View File

@ -3,7 +3,8 @@
#include <QKeyEvent>
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);
}
}