QT基础 框选控件

本文详细介绍了如何通过重写Qt应用程序中的鼠标事件处理函数,实现对界面上控件的框选功能,包括追踪鼠标位置、绘制框选区域、检测框选控件以及响应框选事件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

需求

代码 


需求

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

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

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

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

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

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

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

代码 

    //.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路奇怪

有钱出钱,没钱多出编程主意啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值