#include "hmimodule.h" #include #include // --- 确保包含 QGraphicsView 头文件 --- #include // HMIModule 构造函数无需改动 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()) { // 创建场景时,将 view 指针传入 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); } // 辅助函数,用于设置新创建的组件 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内部会再次生成“创建”日志,这里是合理的 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) { // if (item) { // qDebug() << "Component selected:" << item->componentName() // << "Color:" << item->color(); // // 未来可以在这里将item对象传递给属性编辑器 // } }