#include "hmimodule.h" #include #include #include #include #include #include #include #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) { button->setIcon(QIcon(iconPath)); button->setIconSize(QSize(30, 30)); } void HMIModule::init() { setButtonIcon(ui_->button, ":/resource/image/button.png"); setButtonIcon(ui_->lamp, ":/resource/image/lamp.png"); setButtonIcon(ui_->addPage, ":/resource/image/add.png"); setButtonIcon(ui_->deletePage, ":/resource/image/delete.png"); setButtonIcon(ui_->prePage, ":/resource/image/pre.png"); setButtonIcon(ui_->nextPage, ":/resource/image/next.png"); if (!ui_->hmiGraphicsView->scene()) { m_scene = new CustomGraphicsScene(ui_->hmiGraphicsView, this); m_scene->setSceneRect(0, 0, 800, 600); ui_->hmiGraphicsView->setScene(m_scene); } else { m_scene = qobject_cast(ui_->hmiGraphicsView->scene()); Q_ASSERT(m_scene); } connect(ui_->button, &QPushButton::clicked, this, &HMIModule::prepareToCreateButton); connect(ui_->lamp, &QPushButton::clicked, this, &HMIModule::prepareToCreateIndicator); connect(m_scene, &CustomGraphicsScene::componentCreated, this, &HMIModule::onComponentCreated); connect(m_scene, &CustomGraphicsScene::copyRequestFromScene, this, &HMIModule::onCopyRequested); connect(m_scene, &CustomGraphicsScene::pasteRequestFromScene, this, &HMIModule::onPasteRequested); connect(m_scene, &CustomGraphicsScene::deleteRequestFromScene, this, &HMIModule::onDeleteRequested); // 连接新增的槽函数 connect(ui_->addPage, &QPushButton::clicked, this, &HMIModule::addPage); 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) { if (!item) return; 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()); emit logMessageGenerated(log); } void HMIModule::prepareToCreateButton() { // 获取当前 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() { // 获取当前 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) { setupNewComponent(item); } void HMIModule::onCopyRequested() { // 获取当前 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()); if (!itemToCopy) return; if (dynamic_cast(itemToCopy)) { m_copiedType = ComponentType::Button; } else if (dynamic_cast(itemToCopy)) { m_copiedType = ComponentType::Indicator; } m_copiedColor = itemToCopy->color(); m_hasCopiedItem = true; emit logMessageGenerated(QString("[%1] 复制组件: %2") .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")) .arg(itemToCopy->componentName())); } 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(); } else { newItem = new HmiIndicator(); } if (newItem) { newItem->setColor(m_copiedColor); newItem->setPos(scenePos); currentScene->addItem(newItem); // 使用当前页面的 scene setupNewComponent(newItem); } } void HMIModule::onDeleteRequested() { // 获取当前 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 个组件") .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")) .arg(selected.count())); for (int i = selected.count() - 1; i >= 0; --i) { QGraphicsItem* item = selected.at(i); currentScene->removeItem(item); // 使用当前页面的 scene delete item; } } 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) { 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; } } void HMIModule::onComponentSelected(HmiComponent* item) { // 不需要任何操作,可以留空 } // 新增页面的槽函数 void HMIModule::addPage() { QTabWidget* tabWidget = ui_->tabWidget_2; int pageNumber; int insertIndex = -1; int tabIndex; // 在此处声明 tabIndex // 检查是否有可用的页面编号 if (!m_availablePageNumbers.isEmpty()) { 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 { pageNumber = ++m_pageCount; } // 获取 Page 1 的 Scene CustomGraphicsScene* firstScene = m_scene; // 创建新的页面部件 QWidget* newPage = new QWidget(tabWidget); QString pageName = QString("Page %1").arg(pageNumber); newPage->setObjectName(pageName); // 创建新的 GraphicsView 和 Scene QGraphicsView* newGraphicsView = new QGraphicsView(newPage); CustomGraphicsScene* newScene = new CustomGraphicsScene(newGraphicsView, this); // 设置 GraphicsView 的大小 QSize newViewSize(691, 381); // 设置为指定的宽度和高度 newGraphicsView->resize(newViewSize); // 设置 GraphicsScene 的大小与 Page 1 相同 QRectF newSceneRect = firstScene->sceneRect(); newScene->setSceneRect(newSceneRect); newGraphicsView->setScene(newScene); // 布局 QVBoxLayout* layout = new QVBoxLayout(newPage); layout->addWidget(newGraphicsView); newPage->setLayout(layout); // 添加到 TabWidget 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)); } // 删除页面的槽函数 void HMIModule::deletePage() { QTabWidget* tabWidget = ui_->tabWidget_2; int currentIndex = tabWidget->currentIndex(); if (tabWidget->count() == 1) { QMessageBox::information(nullptr, "提示", "这是最后一页,不能删除!"); return; } if (currentIndex >= 0) { // 获取要删除的页面 QWidget* currentPage = tabWidget->widget(currentIndex); QString pageName = tabWidget->tabText(currentIndex); // 从页面名称中提取页面编号 int pageNumber = pageName.remove("Page ").toInt(); // 将删除的页面编号添加到可用列表中 m_availablePageNumbers.append(pageNumber); std::sort(m_availablePageNumbers.begin(), m_availablePageNumbers.end()); // 从 TabWidget 中移除页面 tabWidget->removeTab(currentIndex); // 删除页面 delete currentPage; // 发送 pageRemoved 信号 emit pageRemoved(pageNumber, currentIndex); // 记录日志 emit logMessageGenerated(QString("[%1] 删除页面: %2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(pageName)); } } // 前一页的槽函数 void HMIModule::prePage() { QTabWidget* tabWidget = ui_->tabWidget_2; int currentIndex = tabWidget->currentIndex(); if (currentIndex > 0) { tabWidget->setCurrentIndex(currentIndex - 1); } } // 后一页的槽函数 void HMIModule::nextPage() { QTabWidget* tabWidget = ui_->tabWidget_2; int currentIndex = tabWidget->currentIndex(); if (currentIndex < tabWidget->count() - 1) { tabWidget->setCurrentIndex(currentIndex + 1); } }