#include "hmimodule.h" #include #include #include #include #include #include #include // 引入 std::sort HMIModule::HMIModule(Ui::MainWindow* ui, QObject *parent) : QObject{parent}, ui_(ui), m_scene(nullptr) {} 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); } 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); 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() { m_scene->setComponentTypeToCreate(ComponentType::Button); m_scene->setMode(CustomGraphicsScene::Mode::CreateItem); } void HMIModule::prepareToCreateIndicator() { m_scene->setComponentTypeToCreate(ComponentType::Indicator); m_scene->setMode(CustomGraphicsScene::Mode::CreateItem); } void HMIModule::onComponentCreated(HmiComponent* item) { setupNewComponent(item); } void HMIModule::onCopyRequested() { QList selected = m_scene->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; HmiComponent* newItem = nullptr; if (m_copiedType == ComponentType::Button) { newItem = new HmiButton(); } else { newItem = new HmiIndicator(); } if (newItem) { newItem->setColor(m_copiedColor); newItem->setPos(scenePos); m_scene->addItem(newItem); setupNewComponent(newItem); } } void HMIModule::onDeleteRequested() { QList selected = m_scene->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); m_scene->removeItem(item); delete item; } } void HMIModule::onComponentSelected(HmiComponent* item) { } // 新增页面的槽函数 void HMIModule::addPage() { QTabWidget* tabWidget = ui_->tabWidget_2; // 获取TabWidget int pageNumber; // 检查是否有可用的页面编号 if (!m_availablePageNumbers.isEmpty()) { // 获取最小的可用的页面编号 (QList 已经是有序的) pageNumber = m_availablePageNumbers.first(); m_availablePageNumbers.removeFirst(); } else { // 如果没有可用的页面编号,则使用 m_pageCount 并递增 pageNumber = ++m_pageCount; } // 创建新的页面部件 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); newScene->setSceneRect(0, 0, 800, 600); newGraphicsView->setScene(newScene); // 布局 QVBoxLayout* layout = new QVBoxLayout(newPage); layout->addWidget(newGraphicsView); newPage->setLayout(layout); // 添加到 TabWidget tabWidget->addTab(newPage, pageName); 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; // 记录日志 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); } }