|
- #include "hmimodule.h"
- #include <QGraphicsScene>
- #include <QGraphicsView> // --- 确保包含 QGraphicsView 头文件 ---
- #include <QDateTime>
-
- // 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<CustomGraphicsScene*>(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<QGraphicsItem*> selected = m_scene->selectedItems();
- if (selected.isEmpty()) return;
-
- // 只复制第一个选中的项目
- HmiComponent* itemToCopy = qgraphicsitem_cast<HmiComponent*>(selected.first());
- if (!itemToCopy) return;
-
- // 存储组件信息到 "剪贴板"
- if (dynamic_cast<HmiButton*>(itemToCopy)) {
- m_copiedType = ComponentType::Button;
- } else if (dynamic_cast<HmiIndicator*>(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 + QPointF(10, 10));
-
- // 使用辅助函数完成添加和信号连接
- // 注意:setupNewComponent内部会再次生成“创建”日志,这里是合理的
- setupNewComponent(newItem);
- }
- }
-
- void HMIModule::onDeleteRequested()
- {
- QList<QGraphicsItem*> 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对象传递给属性编辑器
- // }
- }
|