Qt事件处理机制(二)重写事件处理函数:重写鼠标移动事件,实现用鼠标拖动按钮在widget中自由移动!

前言

首先给出上一篇博客Qt事件处理机制(一)安装事件过滤器的地址:https://blog.csdn.net/qq_40876689/article/details/126473927?spm=1001.2014.3001.5502
上篇博客总结了Qt事件处理机制常用的有2种方法,并记录了第一种方法安装事件过滤器的具体使用步骤及详细的代码。本篇博客记录一下第二种方法,重写事件处理函数的使用步骤以及相应代码。

重写事件处理函数的步骤

1.创建一个新的类,并继承自某一个Qt的类,该类中有你想要重写的事件处理函数。
2.直接在新创建的类中重写相应的处理函数。
此处就不详细说明了, 在下一步代码实例中进行举例说明。

具体示例和代码详解

1.效果图
重写鼠标事件实现鼠标拖动按钮移动

本示例想要自己处理按钮的鼠标按下事件、鼠标松开事件、鼠标移动事件,就需要创建一个类继承自QPushButton,然后重写QPushButton的三个事件处理函数,分别是:

  • mousePressEvent(QMouseEvent*e)
  • mouseRleaseEvent(QMouseEvent*e)
  • mouseMoveEvent(QMouseEvent*e)

QBtnDog.h文件

#pragma once
#include <QPushButton>
#include "ui_QBtnDog.h"

class CQBtnDog : public QPushButton
{
	Q_OBJECT

public:
	CQBtnDog(QWidget*parent = nullptr);
	~CQBtnDog();
protected:
	void mousePressEvent(QMouseEvent*);
	void mouseReleaseEvent(QMouseEvent*);
	void mouseMoveEvent(QMouseEvent*);
private:
	Ui::CQBtnDogClass ui;
	bool m_pPressed;
	QPoint m_pPointPress;
};

QBtnDog.cpp文件

#include "QBtnDog.h"
#include <QMouseEvent>

CQBtnDog::CQBtnDog(QWidget*parent)
	: QPushButton(parent)
	, m_pPressed(false)
{
	ui.setupUi(this);
}
CQBtnDog::~CQBtnDog()
{}

void CQBtnDog::mousePressEvent(QMouseEvent* event)
{
	m_pPressed = true;
	m_pPointPress = QCursor::pos();       //记录鼠标按下时的坐标
}

void CQBtnDog::mouseReleaseEvent(QMouseEvent* event)
{
	m_pPressed = false;
}

void CQBtnDog::mouseMoveEvent(QMouseEvent* event)
{
	if (m_pPressed)
	{
		QPoint newPoint = QCursor::pos();	//记录鼠标移动最新的鼠标坐标
		float xDis = newPoint.x() - m_pPointPress.x();				//计算移动后和按下时的坐标差x
		float yDis = newPoint.y() - m_pPointPress.y();				//计算移动后和按下时的坐标差y
		this->move(this->pos().x() + xDis, this->pos().y()+yDis);	//让自定义按钮的位置加上坐标差,并移动至加上移动距离之后的位置
		m_pPointPress = QCursor::pos();		//更新按下时的坐标为当前坐标位置
	}
}

新创建的类,继承了QPushButton,重写了QPushButton的鼠标按下、松开、移动事件处理函数,所以当鼠标在该按钮有相应的操作时,会执行重写的处理函数。
在鼠标按下事件处理函数中,m_pPressed = true;用于标记鼠标是否按下状态,并记录下当前鼠标的位置。
鼠标松开事件处理函数中,m_pPressed = false;表示鼠标已松开。
鼠标移动事件处理函数中,先获取移动后的鼠标坐标,用移动后的鼠标坐标减去刚刚按下时的鼠标坐标,得到一个移动距离,然后移动当前窗口位置,也就是示例图中的newBtn按钮,将它的位置加上移动距离,就是移动后的位置;最后在更新一下记录最新鼠标坐标的变量;至此,鼠标放在自定义按钮上,按下之后,进行移动,自定义的按钮也会进行移动。

常见的Qt事件类型及相应的事件处理函数

  1. 键盘事件: 按键按下和松开
  2. 鼠标事件: 鼠标移动,鼠标按键的按下和松开
  3. 拖放事件: 用鼠标进行拖放
  4. 滚轮事件: 鼠标滚轮滚动
  5. 绘屏事件: 重绘屏幕的某些部分
  6. 定时事件: 定时器到时
  7. 焦点事件: 键盘焦点移动
  8. 进入和离开事件: 鼠标移入widget之内,或是移出
  9. 移动事件: widget的位置改变
  10. 大小改变事件: widget的大小改变
  11. 显示和隐藏事件: widget显示和隐藏
  12. 窗口事件: 窗口是否为当前窗口
事件类型名称对应的事件处理函数
键盘按下keyPressEvent(QKeyEvnet* event)
键盘松开keyReleaseEvent(QKeyEvnet* event)
鼠标按下mousePressEvent(QMouseEvent* event)
鼠标松开mouseReleaseEvent(QMouseEvent* event)
鼠标移动mouseMoveEvent(QMouseEvent* event)
鼠标双击事件mouseDoubleClickEvent(QMouseEvent* event)
鼠标滚轮事件wheelEvent(QWheelEvent* event)
重绘事件paintEvent(QPaintEvent* event)
大小改变事件resizeEvent(QResizeEvent* event)
移动事件moveEvent(QMoveEvent* event)
进入事件enterEvent(QEvent* event)
离开事件leaveEvent(QEvent* event)
显示事件showEvent(QShowEvent* event)
隐藏事件hideEvent(QHideEvent* event)

总结

本片博客主要记录重写事件处理函数的方法,例子中也展示了如何通过重写按钮鼠标移动事件,拖动按钮在widget中自由移动。
兄弟加油!一起变强!

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要自定义QPlainTextEdit的鼠标左键按下后的框选事件,需要继承QPlainTextEdit并重写mousePressEvent和mouseMoveEvent两个方法。具体步骤如下: 1.在自定义的QPlainTextEdit类头文件声明mousePressEvent和mouseMoveEvent方法: ```c++ class MyPlainTextEdit : public QPlainTextEdit { Q_OBJECT public: explicit MyPlainTextEdit(QWidget *parent = nullptr); protected: void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; private: QTextCursor m_cursor; bool m_isSelecting = false; }; ``` 2.在实现文件重写mousePressEvent和mouseMoveEvent方法: ```c++ MyPlainTextEdit::MyPlainTextEdit(QWidget *parent) : QPlainTextEdit(parent) { setMouseTracking(true); } void MyPlainTextEdit::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton) { m_cursor = cursorForPosition(event->pos()); setTextCursor(m_cursor); m_isSelecting = true; } QPlainTextEdit::mousePressEvent(event); } void MyPlainTextEdit::mouseMoveEvent(QMouseEvent *event) { if(m_isSelecting) { QTextCursor cursor = cursorForPosition(event->pos()); if(cursor.position() > m_cursor.position()) { cursor.setPosition(m_cursor.position(), QTextCursor::KeepAnchor); setTextCursor(cursor); } else { m_cursor.setPosition(cursor.position(), QTextCursor::KeepAnchor); setTextCursor(m_cursor); } } QPlainTextEdit::mouseMoveEvent(event); } ``` 在mousePressEvent方法,判断鼠标是否按下左键,如果是,则获取当前位置对应的文本光标,并将其设置为QPlainTextEdit的光标。然后将m_isSelecting标记为true。在mouseMoveEvent方法,判断m_isSelecting是否为true,如果是,则获取当前位置对应的文本光标,根据光标位置设置文本光标的选区域,并将其设置为QPlainTextEdit的光标。最后调用基类的mouseMoveEvent方法。 需要注意的是,为了能够实时跟踪鼠标移动,需要在构造函数设置setMouseTracking(true)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值