【转】QMouseEvent鼠标事件简介

首先请注意, Qt中的QMouseEvent一般只涉及鼠标左键或右键的单击、释放等操作 ,而对 鼠标滚轮的响应则通过QWheeEvent来处理
以下内容来自QMouseEvent的API文档。
1. QMouseEvent的详细描述

QMouseEvent类包含了用于描述鼠标事件的参数。
当在一个窗口里按住鼠标按键、或移动、或释放就会产生鼠标事件 QMouseEvent
鼠标移动事件只会在按下鼠标按键的情况下才会发生,除非通过显式调用 QWidget::setMouseTracking() 函数来开启鼠标轨迹,这种情况下只要鼠标指针在移动,就会产生一系列的 QT 鼠标事件;
在一个窗口中,当鼠标按键被按下时, QT 会自动捕捉鼠标轨迹,鼠标指针所在的父窗口会继续接受鼠标事件,直到最后一个鼠标按键被释放。
QMouseEvent的传递

一个鼠标事件包含一些指定的接受标志flag用于指出该事件是否会被接收和处理 ,如果鼠标指针所在的父窗口不接收该事件则可以调用函数ignore()予以忽略;
多个重叠的窗口在实现里好比一个递归的倒立树,鼠标事件会沿着鼠标指针所在的父窗口的链表向上传递,直到某个窗口调用accept()函数进行事件处理,否则该事件将被过滤销毁掉;
如果一个鼠标事件传递给鼠标指针所在的窗口,而该窗口的 QT::WA_NoMousePropagation 位置为TRUE,则该事件不会通过父窗口继续向上传递。


可以通过函数pos()、x()、y()得知鼠标事件发生时鼠标指针相对于窗口的位置。
如果把移动窗口作为一次鼠标事件,可以通过函数globalPos()返回的全局坐标值避免窗口的抖动。 

可以使用QWidget::setEndabled()来开启/关闭对应的窗口是否接受键盘和鼠标事件。


核心

需要对鼠标事件进行处理时,通常要重新实现以下几个鼠标事件处理函数:
QWidget::mousePressEvent()
QWidget::mouseReleaseEvent()
QWidget::mouseDoubleClickEvent()

QWidget::mouseMoveEvent()


2. 常用公有成员函数之构造函数


注意在比较简单的应用中,我们并不需要自己构造鼠标事件。



重载版本一

QMouseEvent::QMouseEvent ( 

Type type, 

const QPoint & position, 

Qt::MouseButton button, 

Qt::MouseButtons buttons, 

Qt::KeyboardModifiers modifiers );


重载版本二

QMouseEvent::QMouseEvent ( 

Type type, 

const QPoint & position, 

const QPoint & globalPos, 

Qt::MouseButton button,
Qt::MouseButtons buttons, 

Qt::KeyboardModifiers modifiers );


版本二比版本一多了一个参数,即const QPoint &globalPos,全局位置。



这两个函数都用来构造一个QMouseEvent对象;
参数Type type为枚举值,其取值范围为以下之一:
QEvent::MouseButtonPress 鼠标按键按下,

QEvent::MouseButtonRelease 鼠标按键释放,

QEvent::MouseButtonDblClick 鼠标按键双击,

QEvent::MouseMove 鼠标按键移动;


参数const QPoint &position为鼠标指针相对于接受该鼠标事件窗口的位置;


参数const QPoint &globalPos为鼠标指针在界面上的全局位置,在版本一中该参数被初始化为QCursor::pos();


参数Qt::MouseButton button为一枚举值,其取值可以是:



参数Qt::MouseButtons buttons用于标示在QT事件过程中所有的按键状态位;


参数Qt::KeyboardModifiers modifiers用于标示键盘按键切换期间的状态位。


3. 常用公有成员函数之button()、buttons()


Qt::MouseButton QMouseEvent::button () const
返回引起Qt鼠标事件的button值,该值可以从QT::MouseButton的枚举列表中查找:

当为鼠标指针移动事件时,返回值总是为QT::NoButton。


Qt::MouseButtons QMouseEvent::buttons () const
当一个QT鼠标事件生成时返回button的状态位。
该状态位为Qt::LeftButton, Qt::RightButton, Qt::MidButton的状态执行或操作的结果;
对于鼠标指针移动事件,返回的总是按键被按下的状态位;
当按下鼠标按键或者双击时,返回的总是导致该事件的按键状态位;
对于鼠标按键释放所导致的事件,则不会对该按键执行或操作


4. 常用公有成员函数之globalPos()、globalX()、globalY()


这三个函数返回的是鼠标指针的全局坐标。


const QPoint & QMouseEvent::globalPos () const
返回鼠标指针的全局坐标值,对于异步窗口系统例如X11这是一个很重要的特性,无论何时移动窗口作为对鼠标事件的响应时,globalPos()返回的当前鼠标指针坐标值和QCursor::pos()的返回值是有区别的,可以通过调用QWidget::mapToGlobal(pos())在窗口坐标和全局坐标系之间进行转换。


int QMouseEvent::globalX () const
返回鼠标事件发生时鼠标指针全局坐标的X值,相当于globalPos.x();



int QMouseEvent::globalY () const
返回鼠标事件发生时鼠标指针全局坐标的Y值,相当于globalPos.y()。



5. 常用公有成员函数之pos()、posF()、x()、y()


这四个函数返回的是鼠标指针在当前接收鼠标事件的窗口中的位置。


const QPoint & QMouseEvent::pos () const
返回鼠标指针和接受该鼠标事件窗口的相对位置,其中的坐标值为整型;


QPointF QMouseEvent::posF () const
返回鼠标指针在接受该鼠标事件窗口的相对位置,该坐标值用float类型表示可以增加精确度;


对于上述两个函数,如果把移动窗口作为一次对鼠标事件的响应,那么可以通过调用globalPos()返回的全局坐标值以避免窗口抖动。


int QMouseEvent::x () const
返回鼠标事件发生时,鼠标指针在当前接收鼠标事件的窗口中位置的x坐标值,相当与pos().x();



int QMouseEvent::y () const
返回鼠标事件发生时,鼠标指针在当前接收鼠标事件的窗口中位置的y坐标值,相当于pos().y()。


  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一般来说,可以通过继承QWidget或QGraphicsItem等类,并重写其鼠标事件函数来实现委托于鼠标事件。 以QWidget为例,可以在其子类中重写以下函数: ``` void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); ``` 这些函数分别对应鼠标按下、释放、移动和双击事件。在函数中,可以根据具体需求进行处理,如判断鼠标位置、修改控件状态等。 示例代码: ``` class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr); ~MyWidget(); protected: void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; private: // 其他成员变量和函数 }; void MyWidget::mousePressEvent(QMouseEvent *event) { // 处理鼠标按下事件 } void MyWidget::mouseReleaseEvent(QMouseEvent *event) { // 处理鼠标释放事件 } void MyWidget::mouseMoveEvent(QMouseEvent *event) { // 处理鼠标移动事件 } void MyWidget::mouseDoubleClickEvent(QMouseEvent *event) { // 处理鼠标双击事件 } ``` 需要注意的是,在使用委托模式时,应该在原始对象中调用相应的鼠标事件函数,以便将事件传递给委托对象。例如,在QWidget子类中重写mousePressEvent函数时,应该在函数中调用父类的mousePressEvent函数: ``` void MyWidget::mousePressEvent(QMouseEvent *event) { QWidget::mousePressEvent(event); // 调用父类函数,将事件传递给委托对象 // 处理其他事件 } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值