diff --git a/customgraphics.cpp b/customgraphics.cpp index 2b00a91..c85af8e 100644 --- a/customgraphics.cpp +++ b/customgraphics.cpp @@ -3,6 +3,7 @@ #include #include #include +#include // HmiComponent 基类实现 HmiComponent::HmiComponent(QGraphicsItem *parent) : QGraphicsObject(parent) @@ -65,19 +66,26 @@ void HmiComponent::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) QMenu menu; QAction *copyAction = menu.addAction("复制"); QAction *deleteAction = menu.addAction("删除"); + QAction *appearanceAction = menu.addAction("改变外观"); - // 使用 connect 将菜单动作的触发连接到信号的发射,“复制”和“删除” + // 使用 connect 将菜单动作的触发连接到信号的发射,复制和删除 connect(copyAction, &QAction::triggered, this, [this]() { emit copyRequested(this); }); connect(deleteAction, &QAction::triggered, this, [this]() { emit deleteRequested(this); }); + connect(appearanceAction, &QAction::triggered, this, &HmiComponent::changeAppearance); // 在鼠标光标位置显示菜单 menu.exec(event->screenPos()); } +void HmiComponent::changeAppearance() +{ + emit appearanceChangedRequested(this); +} + HmiButton::HmiButton(QGraphicsItem *parent) : HmiComponent(parent) { m_color = Qt::gray; diff --git a/customgraphics.h b/customgraphics.h index febc723..422afb7 100644 --- a/customgraphics.h +++ b/customgraphics.h @@ -24,6 +24,7 @@ signals: // 为复制和删除请求添加信号 void copyRequested(HmiComponent* item); void deleteRequested(HmiComponent* item); + void appearanceChangedRequested(HmiComponent* item); public: explicit HmiComponent(QGraphicsItem *parent = nullptr); @@ -35,6 +36,9 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; +public slots: + void changeAppearance(); + protected: void mousePressEvent(QGraphicsSceneMouseEvent *event) override; // 重写上下文菜单事件 diff --git a/customgraphicsscene.h b/customgraphicsscene.h index b394f11..7118c4f 100644 --- a/customgraphicsscene.h +++ b/customgraphicsscene.h @@ -30,10 +30,7 @@ signals: protected: void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) override; - - // 在这里添加下面这行代码 void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) override; - void keyPressEvent(QKeyEvent *keyEvent) override; void contextMenuEvent(QGraphicsSceneContextMenuEvent *contextMenuEvent) override; diff --git a/hmimodule.cpp b/hmimodule.cpp index 4dddc74..f90c1a0 100644 --- a/hmimodule.cpp +++ b/hmimodule.cpp @@ -6,6 +6,7 @@ #include #include #include +#include HMIModule::HMIModule(Ui::MainWindow* ui, QObject *parent) : QObject{parent}, ui_(ui), m_scene(nullptr) @@ -62,11 +63,10 @@ void HMIModule::setupNewComponent(HmiComponent* item) connect(item, &HmiComponent::selected, this, &HMIModule::onComponentSelected); connect(item, &HmiComponent::copyRequested, this, &HMIModule::onCopyRequested); connect(item, &HmiComponent::deleteRequested, this, &HMIModule::onDeleteRequested); + connect(item, &HmiComponent::appearanceChangedRequested, this, &HMIModule::onChangeAppearanceRequested); // 连接信号 QString currentTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"); - QString log = QString("[%1] 创建 %2 组件") - .arg(currentTime) - .arg(item->componentName()); + QString log = QString("[%1] 创建 %2 组件").arg(currentTime).arg(item->componentName()); emit logMessageGenerated(log); } @@ -177,6 +177,14 @@ void HMIModule::onDeleteRequested() } } +void HMIModule::onChangeAppearanceRequested(HmiComponent* item) +{ + QColor color = QColorDialog::getColor(item->color(), nullptr, "选择颜色"); + if (color.isValid()) { + item->setColor(color); + } +} + // 添加页面后的槽函数 void HMIModule::onPageAdded(int pageNumber, int index) { @@ -195,11 +203,9 @@ void HMIModule::onPageRemoved(int pageNumber, int index) } } -// 确保提供 HMIModule::onComponentSelected 的定义 void HMIModule::onComponentSelected(HmiComponent* item) { - // 在这里添加你的代码 - // 如果不需要任何操作,可以留空 + // 不需要任何操作,可以留空 } // 新增页面的槽函数 @@ -208,6 +214,7 @@ void HMIModule::addPage() QTabWidget* tabWidget = ui_->tabWidget_2; int pageNumber; int insertIndex = -1; + int tabIndex; // 在此处声明 tabIndex // 检查是否有可用的页面编号 if (!m_availablePageNumbers.isEmpty()) { @@ -224,10 +231,8 @@ void HMIModule::addPage() } else { pageNumber = ++m_pageCount; } - - // 获取 Page 1 的 GraphicsView - QGraphicsView* firstGraphicsView = ui_->hmiGraphicsView; - CustomGraphicsScene* firstScene = m_scene; // 获取 Page 1 的 Scene + // 获取 Page 1 的 Scene + CustomGraphicsScene* firstScene = m_scene; // 创建新的页面部件 QWidget* newPage = new QWidget(tabWidget); @@ -238,10 +243,8 @@ void HMIModule::addPage() QGraphicsView* newGraphicsView = new QGraphicsView(newPage); CustomGraphicsScene* newScene = new CustomGraphicsScene(newGraphicsView, this); - // 设置 GraphicsView 的大小,上下左右各扩大 10 像素 - QSize newViewSize = firstGraphicsView->size(); - newViewSize.setWidth(newViewSize.width() + 20); // 左右各增加 10 像素 - newViewSize.setHeight(newViewSize.height() + 20); // 上下各增加 10 像素 + // 设置 GraphicsView 的大小 + QSize newViewSize(691, 381); // 设置为指定的宽度和高度 newGraphicsView->resize(newViewSize); // 设置 GraphicsScene 的大小与 Page 1 相同 @@ -256,7 +259,6 @@ void HMIModule::addPage() newPage->setLayout(layout); // 添加到 TabWidget - int tabIndex; if (insertIndex != -1) { tabIndex = insertIndex; tabWidget->insertTab(tabIndex, newPage, pageName); @@ -269,7 +271,6 @@ void HMIModule::addPage() connect(newScene, &CustomGraphicsScene::copyRequestFromScene, this, &HMIModule::onCopyRequested); connect(newScene, &CustomGraphicsScene::pasteRequestFromScene, this, &HMIModule::onPasteRequested); connect(newScene, &CustomGraphicsScene::deleteRequestFromScene, this, &HMIModule::onDeleteRequested); - // ***************************************************************************** // 发送 pageAdded 信号 emit pageAdded(pageNumber, tabIndex); diff --git a/hmimodule.h b/hmimodule.h index c3e9826..598d72f 100644 --- a/hmimodule.h +++ b/hmimodule.h @@ -19,7 +19,7 @@ public: signals: void pageAdded(int pageNumber, int index); void pageRemoved(int pageNumber, int index); - void logMessageGenerated(const QString& message); // 确保此行存在 + void logMessageGenerated(const QString& message); private slots: void prepareToCreateButton(); @@ -29,14 +29,11 @@ private slots: void onCopyRequested(); void onPasteRequested(const QPointF& scenePos); void onDeleteRequested(); - - // 新增的槽函数 + void onChangeAppearanceRequested(HmiComponent* item); void addPage(); void deletePage(); void prePage(); void nextPage(); - - // 新增的槽函数 void onPageAdded(int pageNumber, int index); void onPageRemoved(int pageNumber, int index); @@ -48,10 +45,10 @@ private: CustomGraphicsScene* m_scene; ComponentType m_copiedType; QColor m_copiedColor; - bool m_hasCopiedItem = false; - int m_pageCount = 1; // 初始化页面计数器 - QList m_availablePageNumbers; // 存储可用的页面编号 (有序列表) - QList m_pageOrder; // 维护页面顺序 + bool m_hasCopiedItem = false; // 指示当前是否已经有组件被复制 + int m_pageCount = 1; // 初始化页面计数器 + QList m_availablePageNumbers; // 存储可用的页面编号 (有序列表) + QList m_pageOrder; // 维护页面顺序 }; #endif // HMIMODULE_H