From be99eca5e8b31175aa330013aaac1bddd32dfd87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=98=E6=98=A5=E9=98=B3?= <2715725160@qq.com> Date: Fri, 8 Aug 2025 08:43:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=A0=E9=99=A4=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E9=A1=B5=E9=9D=A2=E5=AE=8C=E5=96=84=EF=BC=8C=E8=83=BD?= =?UTF-8?q?=E5=A4=9F=E5=9C=A8=E6=96=B0=E5=A2=9E=E7=9A=84=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E4=B8=AD=E6=96=B0=E5=A2=9E=E5=85=83=E7=B4=A0=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- customgraphics.cpp | 5 -- customgraphicsscene.cpp | 4 -- hmimodule.cpp | 137 +++++++++++++++++++++++++++++++++++----- hmimodule.h | 17 +++-- 4 files changed, 133 insertions(+), 30 deletions(-) diff --git a/customgraphics.cpp b/customgraphics.cpp index fe02e84..2b00a91 100644 --- a/customgraphics.cpp +++ b/customgraphics.cpp @@ -5,7 +5,6 @@ #include // HmiComponent 基类实现 - HmiComponent::HmiComponent(QGraphicsItem *parent) : QGraphicsObject(parent) { setFlag(QGraphicsItem::ItemIsMovable, true); @@ -56,7 +55,6 @@ void HmiComponent::mousePressEvent(QGraphicsSceneMouseEvent *event) QGraphicsObject::mousePressEvent(event); } -// 实现 contextMenuEvent void HmiComponent::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { // 右键点击时,先清空场景中的其他选中项,然后选中当前项 @@ -80,8 +78,6 @@ void HmiComponent::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) menu.exec(event->screenPos()); } - -// HmiButton 类实现 HmiButton::HmiButton(QGraphicsItem *parent) : HmiComponent(parent) { m_color = Qt::gray; @@ -100,7 +96,6 @@ void HmiButton::paintShape(QPainter *painter) painter->drawRect(boundingRect()); } -// HmiIndicator 类实现 HmiIndicator::HmiIndicator(QGraphicsItem *parent) : HmiComponent(parent) { m_color = Qt::green; diff --git a/customgraphicsscene.cpp b/customgraphicsscene.cpp index e17a2b1..41e7448 100644 --- a/customgraphicsscene.cpp +++ b/customgraphicsscene.cpp @@ -27,13 +27,11 @@ void CustomGraphicsScene::setMode(Mode mode) } } -// setComponentTypeToCreate 函数无需改动 void CustomGraphicsScene::setComponentTypeToCreate(ComponentType type) { m_componentTypeToCreate = type; } -// mousePressEvent 函数无需改动 void CustomGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) { if (mouseEvent->button() != Qt::LeftButton) { @@ -76,14 +74,12 @@ void CustomGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) } } -// mouseMoveEvent 函数无需改动 void CustomGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) { QGraphicsScene::mouseMoveEvent(mouseEvent); } -// 修改或新增 keyPressEvent void CustomGraphicsScene::keyPressEvent(QKeyEvent *keyEvent) { // 退出创建模式 diff --git a/hmimodule.cpp b/hmimodule.cpp index 33d6fbd..4dddc74 100644 --- a/hmimodule.cpp +++ b/hmimodule.cpp @@ -5,11 +5,14 @@ #include #include #include -#include // 引入 std::sort +#include HMIModule::HMIModule(Ui::MainWindow* ui, QObject *parent) : QObject{parent}, ui_(ui), m_scene(nullptr) -{} +{ + // 初始化 m_pageOrder + m_pageOrder.append(1); // 初始页面 +} void HMIModule::setButtonIcon(QAbstractButton *button, const QString &iconPath) { @@ -46,6 +49,10 @@ void HMIModule::init() { connect(ui_->deletePage, &QPushButton::clicked, this, &HMIModule::deletePage); connect(ui_->prePage, &QPushButton::clicked, this, &HMIModule::prePage); connect(ui_->nextPage, &QPushButton::clicked, this, &HMIModule::nextPage); + + // 连接信号和槽 + connect(this, &HMIModule::pageAdded, this, &HMIModule::onPageAdded); + connect(this, &HMIModule::pageRemoved, this, &HMIModule::onPageRemoved); } void HMIModule::setupNewComponent(HmiComponent* item) @@ -65,14 +72,30 @@ void HMIModule::setupNewComponent(HmiComponent* item) void HMIModule::prepareToCreateButton() { - m_scene->setComponentTypeToCreate(ComponentType::Button); - m_scene->setMode(CustomGraphicsScene::Mode::CreateItem); + // 获取当前 TabWidget 中选中的 GraphicsView + QTabWidget* tabWidget = ui_->tabWidget_2; + QWidget* currentPage = tabWidget->currentWidget(); + QGraphicsView* currentGraphicsView = currentPage->findChild(); + CustomGraphicsScene* currentScene = qobject_cast(currentGraphicsView->scene()); + + if (currentScene) { + currentScene->setComponentTypeToCreate(ComponentType::Button); + currentScene->setMode(CustomGraphicsScene::Mode::CreateItem); + } } void HMIModule::prepareToCreateIndicator() { - m_scene->setComponentTypeToCreate(ComponentType::Indicator); - m_scene->setMode(CustomGraphicsScene::Mode::CreateItem); + // 获取当前 TabWidget 中选中的 GraphicsView + QTabWidget* tabWidget = ui_->tabWidget_2; + QWidget* currentPage = tabWidget->currentWidget(); + QGraphicsView* currentGraphicsView = currentPage->findChild(); + CustomGraphicsScene* currentScene = qobject_cast(currentGraphicsView->scene()); + + if (currentScene) { + currentScene->setComponentTypeToCreate(ComponentType::Indicator); + currentScene->setMode(CustomGraphicsScene::Mode::CreateItem); + } } void HMIModule::onComponentCreated(HmiComponent* item) @@ -82,7 +105,13 @@ void HMIModule::onComponentCreated(HmiComponent* item) void HMIModule::onCopyRequested() { - QList selected = m_scene->selectedItems(); + // 获取当前 TabWidget 中选中的 GraphicsView + QTabWidget* tabWidget = ui_->tabWidget_2; + QWidget* currentPage = tabWidget->currentWidget(); + QGraphicsView* currentGraphicsView = currentPage->findChild(); + CustomGraphicsScene* currentScene = qobject_cast(currentGraphicsView->scene()); + + QList selected = currentScene->selectedItems(); if (selected.isEmpty()) return; HmiComponent* itemToCopy = qgraphicsitem_cast(selected.first()); @@ -105,6 +134,12 @@ void HMIModule::onPasteRequested(const QPointF& scenePos) { if (!m_hasCopiedItem) return; + // 获取当前 TabWidget 中选中的 GraphicsView + QTabWidget* tabWidget = ui_->tabWidget_2; + QWidget* currentPage = tabWidget->currentWidget(); + QGraphicsView* currentGraphicsView = currentPage->findChild(); + CustomGraphicsScene* currentScene = qobject_cast(currentGraphicsView->scene()); + HmiComponent* newItem = nullptr; if (m_copiedType == ComponentType::Button) { newItem = new HmiButton(); @@ -115,14 +150,20 @@ void HMIModule::onPasteRequested(const QPointF& scenePos) if (newItem) { newItem->setColor(m_copiedColor); newItem->setPos(scenePos); - m_scene->addItem(newItem); + currentScene->addItem(newItem); // 使用当前页面的 scene setupNewComponent(newItem); } } void HMIModule::onDeleteRequested() { - QList selected = m_scene->selectedItems(); + // 获取当前 TabWidget 中选中的 GraphicsView + QTabWidget* tabWidget = ui_->tabWidget_2; + QWidget* currentPage = tabWidget->currentWidget(); + QGraphicsView* currentGraphicsView = currentPage->findChild(); + CustomGraphicsScene* currentScene = qobject_cast(currentGraphicsView->scene()); + + QList selected = currentScene->selectedItems(); if (selected.isEmpty()) return; emit logMessageGenerated(QString("[%1] 删除 %2 个组件") @@ -131,31 +172,63 @@ void HMIModule::onDeleteRequested() for (int i = selected.count() - 1; i >= 0; --i) { QGraphicsItem* item = selected.at(i); - m_scene->removeItem(item); + currentScene->removeItem(item); // 使用当前页面的 scene delete item; } } +// 添加页面后的槽函数 +void HMIModule::onPageAdded(int pageNumber, int index) +{ + if (index < m_pageOrder.size()) { + m_pageOrder[index] = pageNumber; + } else { + m_pageOrder.append(pageNumber); + } +} + +// 删除页面后的槽函数 +void HMIModule::onPageRemoved(int pageNumber, int index) +{ + if (index < m_pageOrder.size()) { + m_pageOrder[index] = -1; + } +} + +// 确保提供 HMIModule::onComponentSelected 的定义 void HMIModule::onComponentSelected(HmiComponent* item) { + // 在这里添加你的代码 + // 如果不需要任何操作,可以留空 } // 新增页面的槽函数 void HMIModule::addPage() { - QTabWidget* tabWidget = ui_->tabWidget_2; // 获取TabWidget + QTabWidget* tabWidget = ui_->tabWidget_2; int pageNumber; + int insertIndex = -1; // 检查是否有可用的页面编号 if (!m_availablePageNumbers.isEmpty()) { - // 获取最小的可用的页面编号 (QList 已经是有序的) pageNumber = m_availablePageNumbers.first(); m_availablePageNumbers.removeFirst(); + + // 查找可用的插入位置 + for (int i = 0; i < m_pageOrder.size(); ++i) { + if (m_pageOrder[i] == -1) { + insertIndex = i; + break; + } + } } else { - // 如果没有可用的页面编号,则使用 m_pageCount 并递增 pageNumber = ++m_pageCount; } + // 获取 Page 1 的 GraphicsView + QGraphicsView* firstGraphicsView = ui_->hmiGraphicsView; + CustomGraphicsScene* firstScene = m_scene; // 获取 Page 1 的 Scene + // 创建新的页面部件 QWidget* newPage = new QWidget(tabWidget); QString pageName = QString("Page %1").arg(pageNumber); @@ -164,7 +237,17 @@ void HMIModule::addPage() // 创建新的 GraphicsView 和 Scene QGraphicsView* newGraphicsView = new QGraphicsView(newPage); CustomGraphicsScene* newScene = new CustomGraphicsScene(newGraphicsView, this); - newScene->setSceneRect(0, 0, 800, 600); + + // 设置 GraphicsView 的大小,上下左右各扩大 10 像素 + QSize newViewSize = firstGraphicsView->size(); + newViewSize.setWidth(newViewSize.width() + 20); // 左右各增加 10 像素 + newViewSize.setHeight(newViewSize.height() + 20); // 上下各增加 10 像素 + newGraphicsView->resize(newViewSize); + + // 设置 GraphicsScene 的大小与 Page 1 相同 + QRectF newSceneRect = firstScene->sceneRect(); + newScene->setSceneRect(newSceneRect); + newGraphicsView->setScene(newScene); // 布局 @@ -173,10 +256,27 @@ void HMIModule::addPage() newPage->setLayout(layout); // 添加到 TabWidget - tabWidget->addTab(newPage, pageName); + int tabIndex; + if (insertIndex != -1) { + tabIndex = insertIndex; + tabWidget->insertTab(tabIndex, newPage, pageName); + } else { + tabIndex = tabWidget->addTab(newPage, pageName); + } + + // 连接信号和槽 ******************************************************************* + connect(newScene, &CustomGraphicsScene::componentCreated, this, &HMIModule::onComponentCreated); + 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); + tabWidget->setCurrentWidget(newPage); - //记录日志 + // 记录日志 emit logMessageGenerated(QString("[%1] 添加页面: %2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(pageName)); } @@ -199,7 +299,7 @@ void HMIModule::deletePage() // 从页面名称中提取页面编号 int pageNumber = pageName.remove("Page ").toInt(); - // 将删除的页面编号添加到可用列表中,并保持列表有序 + // 将删除的页面编号添加到可用列表中 m_availablePageNumbers.append(pageNumber); std::sort(m_availablePageNumbers.begin(), m_availablePageNumbers.end()); @@ -209,6 +309,9 @@ void HMIModule::deletePage() // 删除页面 delete currentPage; + // 发送 pageRemoved 信号 + emit pageRemoved(pageNumber, currentIndex); + // 记录日志 emit logMessageGenerated(QString("[%1] 删除页面: %2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(pageName)); } diff --git a/hmimodule.h b/hmimodule.h index d5ca8f5..c3e9826 100644 --- a/hmimodule.h +++ b/hmimodule.h @@ -4,7 +4,9 @@ #include #include "ui_MainWindow.h" #include "customgraphicsscene.h" -#include // 引入 QList +#include +#include +#include class HMIModule : public QObject { @@ -14,6 +16,11 @@ public: void setButtonIcon(QAbstractButton* button, const QString& iconPath); void init(); +signals: + void pageAdded(int pageNumber, int index); + void pageRemoved(int pageNumber, int index); + void logMessageGenerated(const QString& message); // 确保此行存在 + private slots: void prepareToCreateButton(); void prepareToCreateIndicator(); @@ -29,8 +36,9 @@ private slots: void prePage(); void nextPage(); -signals: - void logMessageGenerated(const QString& message); + // 新增的槽函数 + void onPageAdded(int pageNumber, int index); + void onPageRemoved(int pageNumber, int index); private: void setupNewComponent(HmiComponent* item); @@ -42,7 +50,8 @@ private: QColor m_copiedColor; bool m_hasCopiedItem = false; int m_pageCount = 1; // 初始化页面计数器 - QList m_availablePageNumbers; // 用于存储可用的页面编号 (有序列表) + QList m_availablePageNumbers; // 存储可用的页面编号 (有序列表) + QList m_pageOrder; // 维护页面顺序 }; #endif // HMIMODULE_H