《QT从基础到进阶·十八》QT中的各种鼠标事件QEvent

文章详细阐述了Qt中的各种鼠标事件,如标题栏点击/释放、鼠标按下、移动、释放、双击、滚轮以及在非客户区的鼠标操作。还讨论了如何在不同组件间正确设置鼠标跟踪和事件过滤以实现功能。

1、界面标题栏事件:
NonClientAreaMouseButtonPress 标题栏点击事件
NonClientAreaMouseButtonRelease 标题栏释放事件

bool CustomPopDialog::event(QEvent* event)
{
    switch (event->type())
    {
    case QEvent::MouseButtonRelease:
        //Event of mouse releasing window title
    case QEvent::NonClientAreaMouseButtonRelease:
    {
        QMouseEvent* e = static_cast<QMouseEvent*>(event);
        if (e && e->button() == Qt::LeftButton)
        {
            emit dragRelease(e->globalPos());
        }
        m_isPress = false;
        if (m_timer->isActive() == true)
        {
            m_timer->stop();
        }
    }
    break;
    case QEvent::Close:
    {
        // Signal the pop-up window to destroy
        emit PopDialogClose(m_pWidget);
        m_isPress = false;
        if (m_timer->isActive() == true)
        {
            m_timer->stop();
        }
        break;
    }
    case QEvent::NonClientAreaMouseButtonPress:
    {
        QMouseEvent* e = static_cast<QMouseEvent*>(event);
        if (e && e->button() == Qt::LeftButton)
        {
            m_isPress = true;
            if (m_timer->isActive() == false)
            {
                m_timer->start(10);
            }
        }
        break;
    }
    case QEvent::NonClientAreaMouseMove:
    {
        
        QMouseEvent* e = static_cast<QMouseEvent*>(event);
        
        if (m_isPress)
        {
            int a = 0;
        }

        if (e)
        {
            emit mouseGlobalPoint(e->pos());
        }
        break;
    }
    }
    return QDialog::event(event);
}

2、鼠标按下事件
mousePressEvent(QMouseEvent* event)

在这里插入图片描述

#include <QMouseEvent>

void widget::mousePressEvent(QMouseEvent* event)
{
	//鼠标左键按下
	if (event->button() == Qt::LeftButton)
	{
		//do something
	}
	//...
}

3、鼠标移动事件
mouseMoveEvent(QMouseEvent* event):

pos()函数获取鼠标指针在窗口的位置,pos().x(), pos().y()获取坐标
默认是鼠标按下移动才会触发mouseMoveEvent事件,如果不想按下鼠标移动也能触发mouseMoveEvent事件可以在构造中设置鼠标跟踪:

setMouseTracking(true); //设置鼠标跟踪

如果涉及子界面的鼠标移动事件也需要在子界面的构造中加上鼠标跟踪。

setMouseTrack无效问题:
有时候子界面响应鼠标移动父界面不响应或父界面响应子界面不响应,例如:QLabel放在QStackedWidget上,QStackedWidget放在myWidget的centerWidget上,centerWidget自动放在mainWindow上(mianWindow的中心区域),myWidget继承QWidget,这时候需要层层设置:
QLabel->setMouseTrack(true);
QStackedWidget->setMouseTrack(true);
centerWidget->setMouseTrack(true);
myWidget->setMouseTrack(true);
myWidget->parentWidget()->setMouseTrack(true);

4、鼠标移入移出事件
widget中重写鼠标移入移出事件:

void enterEvent(QEvent* event); //鼠标移入界面触发
void leaveEvent(QEvent* event); //鼠标移出界面触发

5、鼠标释放事件
鼠标按下后在松开鼠标触发。
mouseReleaseEvent(QMouseEvent *event):

6、鼠标双击事件
双击鼠标触发
mouseDoubleClickEvent(QMouseEvent *event):
在这里插入图片描述

7、鼠标滚轮事件
event->delta()数值,角度 * 8 = delta()
在这里插入图片描述

//demo
void THM_CT::wheelEvent(QWheelEvent * event)
{
   // …
	m_currentIndex += event->delta() / 500.0;
	r_image=image.scaled(image.width()*currentIndex,image.height()*currentIndex,Qt::IgnoreAspectRatio, Qt::SmoothTransformation); //图片缩放	
}

最后:
如果在QGraphicsView中无法触发鼠标事件,这是因为鼠标事件是被QGraphicsView里面的viewport截取了,在viewport上安装一个事件过滤器,通过事件过滤来截取鼠标事件,实现鼠标事件的透传。
在这里插入图片描述

📢博客主页: 主页
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 梦回阑珊 原创,首发于 优快云,转载注明出处🙉
📢代码改变世界,你来改变代码!✨

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦回阑珊

一毛不嫌多,一分也是爱

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

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

打赏作者

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

抵扣说明:

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

余额充值