diff --git a/IntegratedPlatform/IntegratedPlatform.pro.user b/IntegratedPlatform/IntegratedPlatform.pro.user index 7696a43..58437fa 100644 --- a/IntegratedPlatform/IntegratedPlatform.pro.user +++ b/IntegratedPlatform/IntegratedPlatform.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -287,19 +287,19 @@ 2 - - ProjectExplorer.CustomExecutableRunConfiguration - + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/admin/Desktop/two/IntegratedPlatform/IntegratedPlatform.pro + C:/Users/admin/Desktop/two/IntegratedPlatform/IntegratedPlatform.pro false false true + true false false true - + C:/Users/admin/Desktop/build-IntegratedPlatform-Desktop_Qt_5_14_2_MinGW_32_bit-Debug 1 diff --git a/IntegratedPlatform/hmiwidget.cpp b/IntegratedPlatform/hmiwidget.cpp index e69de29..6880012 100644 --- a/IntegratedPlatform/hmiwidget.cpp +++ b/IntegratedPlatform/hmiwidget.cpp @@ -0,0 +1,90 @@ +#include "hmiwidget.h" +#include +#include + +ResizableRectangle::ResizableRectangle(qreal x, qreal y, qreal w, qreal h) + : QGraphicsRectItem(x, y, w, h), resizing(false) +{ + setFlag(QGraphicsItem::ItemIsMovable, true); + setFlag(QGraphicsItem::ItemIsSelectable, true); + setCursor(Qt::ArrowCursor); +} + +void ResizableRectangle::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + // 检查是否在调整区域 + if (rect().bottomRight().x() - 10 <= event->pos().x() && + rect().bottomRight().y() - 10 <= event->pos().y()) { + resizing = true; + setCursor(Qt::SizeFDiagCursor); + } else { + // 传递事件给基类处理移动 + resizing = false; + setCursor(Qt::SizeAllCursor); + QGraphicsRectItem::mousePressEvent(event); + } +} + +void ResizableRectangle::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + if (resizing) { + // 调整大小逻辑 + QRectF newRect = rect(); + newRect.setBottomRight(event->pos()); + setRect(newRect); + } else { + // 传递事件给基类处理移动 + QGraphicsRectItem::mouseMoveEvent(event); + } +} + +void ResizableRectangle::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + resizing = false; + setCursor(Qt::ArrowCursor); + QGraphicsRectItem::mouseReleaseEvent(event); +} + +// -------------------- ResizableEllipse -------------------- + +ResizableEllipse::ResizableEllipse(qreal x, qreal y, qreal w, qreal h) + : QGraphicsEllipseItem(x, y, w, h), resizing2(false) +{ + setFlag(QGraphicsItem::ItemIsMovable, true); + setFlag(QGraphicsItem::ItemIsSelectable, true); + setCursor(Qt::ArrowCursor); +} + +void ResizableEllipse::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + QRectF ellipseRect = rect(); + if (ellipseRect.bottomRight().x() - 10 <= event->pos().x() && + ellipseRect.bottomRight().y() - 10 <= event->pos().y()) { + resizing2 = true; + setCursor(Qt::SizeFDiagCursor); + } else { + // 传递事件给基类处理移动 + resizing2 = false; + setCursor(Qt::SizeAllCursor); + QGraphicsEllipseItem::mousePressEvent(event); + } +} + +void ResizableEllipse::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + if (resizing2) { + QRectF newRect = rect(); + newRect.setBottomRight(event->pos()); + setRect(newRect); + } else { + // 传递事件给基类处理移动 + QGraphicsEllipseItem::mouseMoveEvent(event); + } +} + +void ResizableEllipse::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + resizing2 = false; + setCursor(Qt::ArrowCursor); + QGraphicsEllipseItem::mouseReleaseEvent(event); +} diff --git a/IntegratedPlatform/hmiwidget.h b/IntegratedPlatform/hmiwidget.h index 8afb1fd..52b07d0 100644 --- a/IntegratedPlatform/hmiwidget.h +++ b/IntegratedPlatform/hmiwidget.h @@ -1,4 +1,50 @@ #ifndef HMIELEMENT_H #define HMIELEMENT_H +#include +#include +#include +#include +#include +// 自定义矩形类,支持大小调整 +class ResizableRectangle : public QGraphicsRectItem +{ +public: + // 构造函数 + ResizableRectangle(qreal x, qreal y, qreal w, qreal h); + +protected: + // 鼠标按下事件 + void mousePressEvent(QGraphicsSceneMouseEvent *event) override; + + // 鼠标移动事件 + void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; + + // 鼠标释放事件 + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; + +private: + bool resizing; //是否正在调整大小 +}; + +// 自定义圆形类,支持大小调整 +class ResizableEllipse : public QGraphicsEllipseItem +{ +public: + // 构造函数 + ResizableEllipse(qreal x, qreal y, qreal w, qreal h); + +protected: + // 鼠标按下事件 + void mousePressEvent(QGraphicsSceneMouseEvent *event) override; + + // 鼠标移动事件 + void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; + + // 鼠标释放事件 + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; + +private: + bool resizing2; // 是否正在调整大小 +}; #endif // HMIELEMENT_H diff --git a/IntegratedPlatform/mainwindow.cpp b/IntegratedPlatform/mainwindow.cpp index 1129a42..a974450 100644 --- a/IntegratedPlatform/mainwindow.cpp +++ b/IntegratedPlatform/mainwindow.cpp @@ -1,5 +1,6 @@ #include "mainwindow.h" #include "ui_mainwindow.h" +#include"hmiwidget.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) @@ -10,14 +11,13 @@ MainWindow::MainWindow(QWidget *parent) ui->setupUi(this); scene = new QGraphicsScene(this); ui->graphicsView_2->setScene(scene); + connect(ui->treeWidget_2, &QTreeWidget::itemClicked, this, &MainWindow::onHmiItemClicked); ui-> graphicsView_2->viewport()->installEventFilter(this); - addDockWidget(Qt::BottomDockWidgetArea, ui->dockWidget_3);//将dockWidget_3添加到主窗口的下方 - QList items = ui->treeWidget_2->findItems("指示灯", Qt::MatchExactly); - for (QTreeWidgetItem *item : items) { - item->setIcon(0, QIcon("C:/Users/admin/Desktop/T-常开触点-01.png")); - } + addDockWidget(Qt::BottomDockWidgetArea, ui->dockWidget_3);//将dockWidget_3添加到主窗口的下方 + ui->treeWidget_2->topLevelItem(0)->setIcon(0, QIcon("C:/Users/admin/Desktop/灯泡.png")); + ui->treeWidget_2->topLevelItem(1)->setIcon(0, QIcon("C:/Users/admin/Desktop/按钮.png")); } MainWindow::~MainWindow() @@ -25,7 +25,8 @@ MainWindow::~MainWindow() delete ui; } -void MainWindow::onHmiItemClicked(QTreeWidgetItem *item){ +void MainWindow::onHmiItemClicked(QTreeWidgetItem *item) +{ if (item->text(0) == "指示灯") { canDrawCircle = true; @@ -43,29 +44,43 @@ void MainWindow::onHmiItemClicked(QTreeWidgetItem *item){ } bool MainWindow::eventFilter(QObject *obj, QEvent *event) { - if (obj == ui->graphicsView_2->viewport() && event->type() == QEvent::MouseButtonPress) { + // 修正1:使用一致的视图对象名(graphicsView_2) + if (obj != ui->graphicsView_2->viewport()) { + return false; // 不是我们关心的对象,不处理 + } + // 只处理鼠标按下事件 + if (event->type() == QEvent::MouseButtonPress) { QMouseEvent *mouseEvent = static_cast(event); if (mouseEvent->button() == Qt::LeftButton) { // 获取点击的场景坐标 - if (canDrawCircle) - { - QPointF scenePos = ui->graphicsView_2->mapToScene(mouseEvent->pos());// 在点击位置绘制一个指示灯 - scene->addEllipse(scenePos.x(), scenePos.y(), 50, 50, QPen(Qt::black), QBrush(Qt::blue)); - } - else if (canDrawRectangle) - { - QPointF scenePos = ui->graphicsView_2->mapToScene(mouseEvent->pos());//在点击位置绘制一个按钮 - scene->addRect(scenePos.x(), scenePos.y(), 50, 50, QPen(Qt::black), QBrush(Qt::blue)); + QPointF scenePos = ui->graphicsView_2->mapToScene(mouseEvent->pos()); + + // 根据标志绘制元素 + if (canDrawCircle) { + ResizableEllipse *circle = new ResizableEllipse( + scenePos.x(), scenePos.y(), 50, 50); + circle->setBrush(QBrush(Qt::red)); // 设置指示灯颜色 + scene->addItem(circle); } - QTreeWidgetItem *selectedItem = ui->treeWidget_2->currentItem(); - if (selectedItem) - { - selectedItem->setSelected(false);//取消选中当前项目 + else if (canDrawRectangle) { + ResizableRectangle *rectangle = new ResizableRectangle( + scenePos.x(), scenePos.y(), 100, 50); + rectangle->setBrush(QBrush(Qt::yellow)); // 设置按钮颜色 + scene->addItem(rectangle); } + + // 重置绘制标志 canDrawCircle = false; canDrawRectangle = false; - return true; + + // 修正2:使用一致的树控件对象名(treeWidget_2) + if (ui->treeWidget_2->currentItem()) { + ui->treeWidget_2->currentItem()->setSelected(false); + } + + return true; // 事件已处理 } - return QMainWindow::eventFilter(obj, event); } + // 修正3:正确处理未过滤的事件 + return QMainWindow::eventFilter(obj, event); } diff --git a/IntegratedPlatform/mainwindow.ui b/IntegratedPlatform/mainwindow.ui index 4042b83..027bd6c 100644 --- a/IntegratedPlatform/mainwindow.ui +++ b/IntegratedPlatform/mainwindow.ui @@ -52,7 +52,7 @@ 宋体 - 12 + 16 @@ -110,7 +110,7 @@ 宋体 - 18 + 16