Qt QMouseEvent鼠标事件简介

一、QMouseEvent的详细描述

首先请注意,Qt中的QMouseEvent一般只涉及鼠标左键或右键的单击、释放等操作,而对鼠标滚轮的响应则通过QWheeEvent来处理。

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()

三、鼠标事件

鼠标事件使用的时候,加头文件

#include <QMouseEvent>

1.鼠标按下事件

void Widget::mousePressEvent(QMouseEvent *event)
{
    // 如果是鼠标左键按下
    if(event->button() == Qt::LeftButton)
   {
        ···
    }
    // 如果是鼠标右键按下
    else if(event->button() == Qt::RightButton)
   {
       ···
    }
}

2.鼠标移动事件

默认情况下,触发事件需要点击一下,才能触发可设置为自动触发:setMouseTracking(true);

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    // 这里必须使用buttons()
    if(event->buttons() & Qt::LeftButton) //进行的按位与
    { 
       ···
    }
}

3.鼠标释放事件

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
   ···
}

4.鼠标双击事件

void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
    // 如果是鼠标左键按下
    if(event->button() == Qt::LeftButton){
      
        ···
    }
}

5.滚轮事件

void Widget::wheelEvent(QWheelEvent *event)
{
    if(event->delta() > 0)// 当滚轮远离使用者时
    {
        ···
    }
    else//当滚轮向使用者方向旋转时
    {
        ···
    }
}

四、键盘事件

键盘事件使用时,加头文件

#include <QKeyEvent>

1.键盘按下事件

void Widget::keyPressEvent(QKeyEvent *event)
{
    // 是否按下Ctrl键      特殊按键
    if(event->modifiers() == Qt::ControlModifier)
    {
        // 是否按下M键    普通按键  类似
        if(event->key() == Qt::Key_M)
            ···
    }
    else 
       QWidget::keyPressEvent(event);   //保存默认事件

    //如果是处理两个普通按键,得避免自动重复,释放中也要处理
    if(event->key() == Qt::Key_Up)
     {
        // 按键重复时不做处理
        if(event->isAutoRepeat())   return;
        // 标记向上方向键已经按下
        keyUp = true;
    }
    else if(event->key() == Qt::Key_Left)
   {
        if(event->isAutoRepeat()) return;
        keyLeft = true;
    }
}

2.按键释放事件

void Widget::keyReleaseEvent(QKeyEvent *event)
{
    ···
    //如果是处理两个普通按键,得避免自动重复
    if(event->key() == Qt::Key_Up)
    {
        if(event->isAutoRepeat()) return;
     ···       
    }
    else if(event->key() == Qt::Key_Left)
    {
        if(event->isAutoRepeat()) return;
       ···
    }
}

五、常用公有成员函数

1.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()。


2.pos()、posF()、x()、y()这四个函数返回的是鼠标指针在当前接收鼠标事件的窗口中的位置。


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


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


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


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

bool QtWidgetsApplication1::event(QEvent *event)
{
	//键盘事件,按下任意键打印
	if (event->type() == QEvent::MouseButtonPress)
	{
		QMouseEvent *k = dynamic_cast<QMouseEvent *>(event);
		//相对坐标
		qDebug() << QStringLiteral("相对坐标") << k->x() << " : " << k->y();
		//相对程序坐标
		qDebug() << QStringLiteral("程序坐标") << k->windowPos().x() << " : " << k->windowPos().y();
		//相对屏幕坐标
		qDebug() << QStringLiteral("屏幕坐标") << k->screenPos().x() << " : " << k->screenPos().y();

		//本地坐标转全局(屏幕坐标)
		QPoint point = mapToGlobal(k->pos());
		qDebug() << QStringLiteral("转换全局坐标") << point.x() << " : " << point.y();

		//获取鼠标的坐标
		qDebug() << QStringLiteral("获取鼠标的坐标") << QCursor::pos().x() << " : " << QCursor::pos().y();

		//鼠标按键事件
		if (k->buttons() & Qt::LeftButton);	//左键,右键,中间件Qt::RightButton; Qt::MidButton
		{
			//...
		}
		if (k->buttons() & Qt::LeftButton && k->buttons() & Qt::RightButton);	//左右键同时按下
		{
			//...
		}
	}
	
	//qDebug() << event->type() << endl;
	return QWidget::event(event);
}
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值