#include "mainwindow.h" #include "ui_mainwindow.h" #include"hmiwidget.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) ,canDrawCircle(false) ,canDrawRectangle(false) { 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添加到主窗口的下方 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() { delete ui; } void MainWindow::onHmiItemClicked(QTreeWidgetItem *item) { if (item->text(0) == "指示灯") { canDrawCircle = true; canDrawRectangle = false; } else if(item->text(0) == "按钮") { canDrawCircle=false; canDrawRectangle = true;//如果点击的是按钮,则不允许绘制灯 } else { canDrawRectangle = false;//如果点击的是灯,则不允许绘制按钮 canDrawCircle = false; } } bool MainWindow::eventFilter(QObject *obj, QEvent *event) { // 修正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) { // 获取点击的场景坐标 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); } 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; // 修正2:使用一致的树控件对象名(treeWidget_2) if (ui->treeWidget_2->currentItem()) { ui->treeWidget_2->currentItem()->setSelected(false); } return true; // 事件已处理 } } // 修正3:正确处理未过滤的事件 return QMainWindow::eventFilter(obj, event); }