目录
需求
先说需求:比如有的时候想要框选界面上的控件,要怎么判断呢?
可以通过以下步骤来实现这个功能:
-
重写鼠标事件处理:对于你想要框选的控件,你需要重写它们的鼠标事件处理函数(如
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