赞
踩
目录
先说需求:比如有的时候想要框选界面上的控件,要怎么判断呢?
可以通过以下步骤来实现这个功能:
重写鼠标事件处理:对于你想要框选的控件,你需要重写它们的鼠标事件处理函数(如 mousePressEvent
, mouseMoveEvent
, 和 mouseReleaseEvent
)。
追踪鼠标移动:当用户按下鼠标按钮并开始移动时,开始追踪鼠标的位置。你可以使用 QMouseEvent
的 pos()
方法来获取鼠标的当前位置。
绘制框选区域:在 paintEvent
方法中,根据鼠标移动的位置绘制一个矩形框,表示用户正在框选的区域。
检测框选控件:当用户释放鼠标按钮时,检查框选区域内有哪些控件。这可能需要你遍历界面上的所有控件,并检查它们是否在框选区域内。
响应框选事件:一旦你知道了哪些控件被框选,你可以执行相应的操作,比如高亮这些控件、执行某个命令等。
- //.h
- void mousePressEvent(QMouseEvent* event);
- void mouseReleaseEvent(QMouseEvent* event);
- void mouseMoveEvent(QMouseEvent* event) override;
- void paintEvent(QPaintEvent* e);
- //选中标识
- bool selecting = false;
- //矩形框
- QRect selectionRect;
//如果不想要矩形框去掉相应绘制窗口就可以了
- //.cpp
-
- void QtWidgetsApplication5::mousePressEvent(QMouseEvent* event)
- {
- if (event->button() == Qt::LeftButton)
- {
- selecting = true;
- selectionRect.setTopLeft(event->pos());
- selectionRect.setBottomRight(event->pos());
- update();
- }
- }
-
- void QtWidgetsApplication5::mouseReleaseEvent(QMouseEvent* event)
- {
- if (event->button() == Qt::LeftButton && selecting) {
- selecting = false;
- // 调用基类的mouseReleaseEvent
- QWidget::mouseReleaseEvent(event);
-
- // 获取子对象列表
- const QObjectList& childrenList = this->children();
-
- // 遍历子对象列表
- QList<QWidget*> selectedWidgets;
- foreach(QObject * child, childrenList) {
- // 尝试将子对象转换为QWidget指针
- QWidget* widget = qobject_cast<QWidget*>(child);
- //if (widget && selectionRect.intersects(widget->geometry()))
- //要求全选状态
- if (widget && selectionRect.contains(widget->geometry()))
- {
- // 如果转换成功且控件与选择区域相交,则添加到选中控件列表
- selectedWidgets.append(widget);
- }
- }
-
- // 处理选中的控件
- foreach(QWidget * widget, selectedWidgets) {
- qDebug() << "Selected widget:" << widget;
- // 在这里可以执行您想要对选中控件进行的操作
- qDebug() << widget->objectName();
- }
- }
- }
-
- void QtWidgetsApplication5::mouseMoveEvent(QMouseEvent* event)
- {
- if ((event->buttons() & Qt::LeftButton) && selecting) {
- selectionRect.setBottomRight(event->pos());
- update();
- }
- }
-
- void QtWidgetsApplication5::paintEvent(QPaintEvent* e)
- {
- if (selecting) {
- QPainter painter(this);
- painter.setPen(QPen(Qt::red, 2));
- painter.drawRect(selectionRect);
- }
- }
tip:此种方式不太好处理z方向的ui
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。