#include "hmi.h" #include "ui_hmi.h" #include #include #include #include #include #include #include #include #include #include "creatitem.h" HMI::HMI(QWidget *parent) : QWidget(parent), ui(new Ui::HMI) { ui->setupUi(this); ui->tabWidget->setTabsClosable(true); ui->tabWidget->setMovable(true); /* 2. 列表 */ ui->listWidget->setViewMode(QListView::IconMode); ui->listWidget->setIconSize(QSize(60, 30)); ui->listWidget->setDragEnabled(false); ui->listWidget->viewport()->installEventFilter(this); // 创建初始页面 newPage(); /* 3. 填充列表 */ createComponents(); connect(ui->listWidget,&QListWidget::currentTextChanged,this,&HMI::onListwidgetCurrenttextchanged); // 连接标签页信号 // connect(ui->tabWidget, &QTabWidget::currentChanged, this, &HMI::onTabChanged); connect(ui->tabWidget, &QTabWidget::tabCloseRequested, [this](int index) { if (scenes.size() > 1) { delete scenes.takeAt(index); delete views.takeAt(index); ui->tabWidget->removeTab(index); } else { QMessageBox::information(this, "提示", "至少保留一个页面"); } }); } HMI::~HMI() { qDeleteAll(scenes); qDeleteAll(views); delete ui; } void HMI::newPage() { // 创建新场景 QGraphicsScene* newScene = new QGraphicsScene(this); // 创建新视图 MyGraphicsView* newView = new MyGraphicsView(ui->tabWidget); newView->setScene(newScene); newView->setSceneRect(0, 0, 800, 600); newView->setDragMode(QGraphicsView::RubberBandDrag); // 添加到标签页 int newIndex = ui->tabWidget->addTab(newView, QString("页面 %1").arg(scenes.size() + 1)); ui->tabWidget->setCurrentIndex(newIndex); // 保存场景和视图 scenes.append(newScene); views.append(newView); } bool HMI::eventFilter(QObject *obj, QEvent *event) { if (obj == ui->listWidget->viewport()) { static QListWidgetItem *dragItem = nullptr; static QPoint startPos; if (event->type() == QEvent::MouseButtonPress) { auto *me = static_cast(event); if (me->button() == Qt::LeftButton) { dragItem = ui->listWidget->itemAt(me->pos()); startPos = me->pos(); } } else if (event->type() == QEvent::MouseMove && dragItem) { auto *me = static_cast(event); if ((me->pos() - startPos).manhattanLength() >= QApplication::startDragDistance()) { QString type = dragItem->data(Qt::UserRole).toString(); QMimeData *mime = new QMimeData; mime->setData("application/x-component", type.toUtf8()); QDrag *drag = new QDrag(this); drag->setMimeData(mime); drag->setPixmap(dragItem->icon().pixmap(ui->listWidget->iconSize())); drag->setHotSpot(drag->pixmap().rect().center()); drag->exec(Qt::CopyAction); dragItem = nullptr; } } else if (event->type() == QEvent::MouseButtonRelease) { dragItem = nullptr; } } return QWidget::eventFilter(obj, event); } void HMI::createComponents() { struct Comp { QString name; QColor color; }; const QVector comps = { {"按钮", Qt::blue}, {"指示灯", Qt::red} }; for (const Comp &c : comps) { QListWidgetItem *it = new QListWidgetItem(c.name, ui->listWidget); QPixmap pix(60, 30); pix.fill(Qt::white); QPainter p(&pix); p.setRenderHint(QPainter::Antialiasing); p.setBrush(c.color.lighter(150)); p.setPen(QPen(c.color, 2)); p.drawRoundedRect(QRect(5, 5, 50, 20), 3, 3); p.setPen(Qt::black); p.drawText(QRect(5, 5, 50, 20), Qt::AlignCenter, c.name); it->setIcon(QIcon(pix)); it->setData(Qt::UserRole, c.name); } } void HMI::clearScene() { if (currentPageIndex() >= 0 && currentPageIndex() < scenes.size()) { scenes[currentPageIndex()]->clear(); } } int HMI::currentPageIndex() const { return ui->tabWidget->currentIndex(); } void HMI::applyProjectToScene(const Project& proj, int pageIndex) { if (pageIndex < 0 || pageIndex >= scenes.size()) return; scenes[pageIndex]->clear(); QVector itemObjs; for (const auto& d : proj.items_) { Item* item = creatItem(d.type); if (!item) continue; item->setPos(d.x, d.y); item->setRegisterId(d.registerId); connect(item, &Item::requestCopy, views[pageIndex], &MyGraphicsView::onItemRequestCopy); connect(item, &Item::requestDelete, views[pageIndex], &MyGraphicsView::onItemRequestDelete); connect(item, &Item::requestBindRegister, views[pageIndex], &MyGraphicsView::onItemRequestBindRegister); scenes[pageIndex]->addItem(item); itemObjs.append(item); } } void HMI::extractSceneToProject(Project& proj, int pageIndex) { if (pageIndex < 0 || pageIndex >= scenes.size()) return; proj.clear(); QList items; for (QGraphicsItem* gi : scenes[pageIndex]->items()){ if (Item* it = dynamic_cast(gi)){ items.append(it); } } for (Item* it : items) { Project::ItemData d; d.type = it->itemType(); d.x = it->pos().x(); d.y = it->pos().y(); d.registerId = it->registerId(); proj.items_.append(d); } for (QGraphicsItem* gi : scenes[pageIndex]->items()) { if (Connection* conn = dynamic_cast(gi)) { int fromIdx = items.indexOf(conn->from_); int toIdx = items.indexOf(conn->to_); if (fromIdx >= 0 && toIdx >= 0) { Project::ConnectionData c; c.from = fromIdx; c.to = toIdx; c.fromType = static_cast(conn->fromType_); c.toType = static_cast(conn->toType_); proj.connections_.append(c); } } } } void HMI::onListwidgetCurrenttextchanged(const QString &text) { selectedComponentType = text; }