当前位置:   article > 正文

QT基础 框选控件

QT基础 框选控件

目录

需求

代码 


需求

先说需求:比如有的时候想要框选界面上的控件,要怎么判断呢?

可以通过以下步骤来实现这个功能:

  1. 重写鼠标事件处理:对于你想要框选的控件,你需要重写它们的鼠标事件处理函数(如 mousePressEventmouseMoveEvent, 和 mouseReleaseEvent)。

  2. 追踪鼠标移动:当用户按下鼠标按钮并开始移动时,开始追踪鼠标的位置。你可以使用 QMouseEvent 的 pos() 方法来获取鼠标的当前位置。

  3. 绘制框选区域:在 paintEvent 方法中,根据鼠标移动的位置绘制一个矩形框,表示用户正在框选的区域。

  4. 检测框选控件:当用户释放鼠标按钮时,检查框选区域内有哪些控件。这可能需要你遍历界面上的所有控件,并检查它们是否在框选区域内。

  5. 响应框选事件:一旦你知道了哪些控件被框选,你可以执行相应的操作,比如高亮这些控件、执行某个命令等。

代码 

  1. //.h
  2. void mousePressEvent(QMouseEvent* event);
  3. void mouseReleaseEvent(QMouseEvent* event);
  4. void mouseMoveEvent(QMouseEvent* event) override;
  5. void paintEvent(QPaintEvent* e);
  6. //选中标识
  7. bool selecting = false;
  8. //矩形框
  9. QRect selectionRect;

 //如果不想要矩形框去掉相应绘制窗口就可以了

  1. //.cpp
  2. void QtWidgetsApplication5::mousePressEvent(QMouseEvent* event)
  3. {
  4. if (event->button() == Qt::LeftButton)
  5. {
  6. selecting = true;
  7. selectionRect.setTopLeft(event->pos());
  8. selectionRect.setBottomRight(event->pos());
  9. update();
  10. }
  11. }
  12. void QtWidgetsApplication5::mouseReleaseEvent(QMouseEvent* event)
  13. {
  14. if (event->button() == Qt::LeftButton && selecting) {
  15. selecting = false;
  16. // 调用基类的mouseReleaseEvent
  17. QWidget::mouseReleaseEvent(event);
  18. // 获取子对象列表
  19. const QObjectList& childrenList = this->children();
  20. // 遍历子对象列表
  21. QList<QWidget*> selectedWidgets;
  22. foreach(QObject * child, childrenList) {
  23. // 尝试将子对象转换为QWidget指针
  24. QWidget* widget = qobject_cast<QWidget*>(child);
  25. //if (widget && selectionRect.intersects(widget->geometry()))
  26. //要求全选状态
  27. if (widget && selectionRect.contains(widget->geometry()))
  28. {
  29. // 如果转换成功且控件与选择区域相交,则添加到选中控件列表
  30. selectedWidgets.append(widget);
  31. }
  32. }
  33. // 处理选中的控件
  34. foreach(QWidget * widget, selectedWidgets) {
  35. qDebug() << "Selected widget:" << widget;
  36. // 在这里可以执行您想要对选中控件进行的操作
  37. qDebug() << widget->objectName();
  38. }
  39. }
  40. }
  41. void QtWidgetsApplication5::mouseMoveEvent(QMouseEvent* event)
  42. {
  43. if ((event->buttons() & Qt::LeftButton) && selecting) {
  44. selectionRect.setBottomRight(event->pos());
  45. update();
  46. }
  47. }
  48. void QtWidgetsApplication5::paintEvent(QPaintEvent* e)
  49. {
  50. if (selecting) {
  51. QPainter painter(this);
  52. painter.setPen(QPen(Qt::red, 2));
  53. painter.drawRect(selectionRect);
  54. }
  55. }

tip:此种方式不太好处理z方向的ui

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/992313
推荐阅读
相关标签
  

闽ICP备14008679号