Qt 自定义鼠标事件以及滚轮事件

鼠标事件及滚轮事件

前言

QMouseEvent类用于表示一个鼠标事件,当按下鼠标或者移动鼠标时就会产生鼠标事件,利用QMouseEvent类可以获取鼠标时哪个键给按下了
QWheelEvent类用于表示鼠标滚轮事件,在这个类中主要是获取滚轮移动的方向和距离
我们就用一个实际例子来重写下鼠标和滚轮事件


代码实现

需求:

1.把鼠标的型状改为小手
2.双击使窗口全屏和缩小
3.鼠标移动来拖动窗口
4.对文本框中的内容通过滚轮进行内容的放大和缩小
5.点击右键把指针变成一个自定义的图片
6.释放鼠标时鼠标形状恢复(变成原来的小手)

需要在ui界面先放一个TextEdit
头文件中声明对应各个方法:

protected:
    void mousePressEvent(QMouseEvent *event);		//鼠标按下事件
    void mouseReleaseEvent(QMouseEvent *event);		//鼠标释放事件
    void mouseDoubleClickEvent(QMouseEvent *event);	//鼠标双击事件
    void mouseMoveEvent(QMouseEvent *event);		//鼠标移动事件
    void wheelEvent(QWheelEvent *event);			//滚轮事件

widget构造函数

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QCursor cursor;                     //创建光标对象
    cursor.setShape(Qt::OpenHandCursor);//设置光标形状(小手)
    setCursor(cursor);                  //使用光标

}

接下来就是主要大的鼠标事件以及滚轮事件了看代码:

void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton){    //左键按下
        QCursor cursor;
        cursor.setShape(Qt::UpArrowCursor);
        QApplication::setOverrideCursor(cursor);//使鼠标指针暂时改变形状
        offset=event->globalPos()-pos();        //获取指针位置和窗口位置的差值
        qDebug()<<"Pressoffset"<<offset;
    }
    else if(event->button()==Qt::RightButton)//如果是右键按下
    {
        QCursor cursor(QPixmap("../background_1.png"));
        QApplication::setOverrideCursor(cursor);//使用自定义的图片作为鼠标指针
    }
}

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    QApplication::restoreOverrideCursor();
}

void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton){
        if(windowState()!=Qt::WindowFullScreen){
            setWindowState(Qt::WindowFullScreen);
        }else{
            setWindowState(Qt::WindowNoState);

        }
    }
}

//鼠标移动事件
void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons()&Qt::LeftButton){	//必须要用到buttons();
        QPoint temp;
        temp=event->globalPos()-offset;
        qDebug()<<"Moveoffset"<<offset;
        move(temp);			//使用鼠标指针当前的位置减去差值就得到了窗口应该移动的位置
    }
}

//滚轮事件
void Widget::wheelEvent(QWheelEvent *event)
{
    if(event->delta()>0){           //滚轮向我们走远
        ui->textEdit->zoomIn();     //放大
    }else{                          //滚轮向我们靠近
        ui->textEdit->zoomOut();    //缩小
    }
}

对于移动事件为什么要用到buttons()而不是button()呢?
可以这样理解因为鼠标移动时会检测所有按下的按键(我们这里是左键一直按着),而button()不能检测,比如我们原来是一直按着左键的然后我们移动检测到的会是Qt::NoButton(仅仅检测当前这一下子是否有按下键)这是不行的,所以我们得用buttons()(这个可以检测到当前所有有按下的按键)然后&Qt::LeftButton看按下的键中有没有左键。


对于移动的为什么是

		QPoint temp;
        temp=event->globalPos()-offset;
        qDebug()<<"Moveoffset"<<offset;
        move(temp);	

看图:
在这里插入图片描述

运行结果

一:正常情况
在这里插入图片描述

二:滚轮效果
在这里插入图片描述

三:双击全屏
在这里插入图片描述
四:右键把鼠标样式变成自己定义的图片
在这里插入图片描述
五:释放鼠标(鼠标还原变成小手)
在这里插入图片描述

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值