You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.9 KiB

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include"hmiwidget.h"
  4. MainWindow::MainWindow(QWidget *parent)
  5. : QMainWindow(parent)
  6. , ui(new Ui::MainWindow)
  7. ,canDrawCircle(false)
  8. ,canDrawRectangle(false)
  9. {
  10. ui->setupUi(this);
  11. scene = new QGraphicsScene(this);
  12. ui->graphicsView_2->setScene(scene);
  13. connect(ui->treeWidget_2, &QTreeWidget::itemClicked, this, &MainWindow::onHmiItemClicked);
  14. ui-> graphicsView_2->viewport()->installEventFilter(this);
  15. addDockWidget(Qt::BottomDockWidgetArea, ui->dockWidget_3);//将dockWidget_3添加到主窗口的下方
  16. ui->treeWidget_2->topLevelItem(0)->setIcon(0, QIcon("C:/Users/admin/Desktop/灯泡.png"));
  17. ui->treeWidget_2->topLevelItem(1)->setIcon(0, QIcon("C:/Users/admin/Desktop/按钮.png"));
  18. }
  19. MainWindow::~MainWindow()
  20. {
  21. delete ui;
  22. }
  23. void MainWindow::onHmiItemClicked(QTreeWidgetItem *item)
  24. {
  25. if (item->text(0) == "指示灯")
  26. {
  27. canDrawCircle = true;
  28. canDrawRectangle = false;
  29. }
  30. else if(item->text(0) == "按钮")
  31. {
  32. canDrawCircle=false;
  33. canDrawRectangle = true;//如果点击的是按钮,则不允许绘制灯
  34. }
  35. else {
  36. canDrawRectangle = false;//如果点击的是灯,则不允许绘制按钮
  37. canDrawCircle = false;
  38. }
  39. }
  40. bool MainWindow::eventFilter(QObject *obj, QEvent *event)
  41. {
  42. // 修正1:使用一致的视图对象名(graphicsView_2)
  43. if (obj != ui->graphicsView_2->viewport()) {
  44. return false; // 不是我们关心的对象,不处理
  45. }
  46. // 只处理鼠标按下事件
  47. if (event->type() == QEvent::MouseButtonPress) {
  48. QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
  49. if (mouseEvent->button() == Qt::LeftButton) {
  50. // 获取点击的场景坐标
  51. QPointF scenePos = ui->graphicsView_2->mapToScene(mouseEvent->pos());
  52. // 根据标志绘制元素
  53. if (canDrawCircle) {
  54. ResizableEllipse *circle = new ResizableEllipse(
  55. scenePos.x(), scenePos.y(), 50, 50);
  56. circle->setBrush(QBrush(Qt::red)); // 设置指示灯颜色
  57. scene->addItem(circle);
  58. }
  59. else if (canDrawRectangle) {
  60. ResizableRectangle *rectangle = new ResizableRectangle(
  61. scenePos.x(), scenePos.y(), 100, 50);
  62. rectangle->setBrush(QBrush(Qt::yellow)); // 设置按钮颜色
  63. scene->addItem(rectangle);
  64. }
  65. // 重置绘制标志
  66. canDrawCircle = false;
  67. canDrawRectangle = false;
  68. // 修正2:使用一致的树控件对象名(treeWidget_2)
  69. if (ui->treeWidget_2->currentItem()) {
  70. ui->treeWidget_2->currentItem()->setSelected(false);
  71. }
  72. return true; // 事件已处理
  73. }
  74. }
  75. // 修正3:正确处理未过滤的事件
  76. return QMainWindow::eventFilter(obj, event);
  77. }