|
- #include "hmi.h"
- #include "ui_hmi.h"
- #include <QListWidgetItem>
- #include <QMimeData>
- #include <QDrag>
- #include <QPainter>
- #include <QMouseEvent>
- #include <QDropEvent>
- #include <QGraphicsView>
- #include <QMessageBox>
- #include <QVBoxLayout>
- #include "creatitem.h"
-
- HMI::HMI(RegisterManager *regManager, 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<QMouseEvent*>(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<QMouseEvent*>(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<Comp> 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<Item*> 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<Item*> items;
- for (QGraphicsItem* gi : scenes[pageIndex]->items()){
- if (Item* it = dynamic_cast<Item*>(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<Connection*>(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<int>(conn->fromType_);
- c.toType = static_cast<int>(conn->toType_);
- proj.connections_.append(c);
- }
- }
- }
- }
-
- void HMI::onListwidgetCurrenttextchanged(const QString &text)
- {
- selectedComponentType = text;
- }
|