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

看图:
Qt 自定义鼠标事件以及滚轮事件_第1张图片

运行结果

一:正常情况
Qt 自定义鼠标事件以及滚轮事件_第2张图片

二:滚轮效果
Qt 自定义鼠标事件以及滚轮事件_第3张图片

三:双击全屏

四:右键把鼠标样式变成自己定义的图片
Qt 自定义鼠标事件以及滚轮事件_第4张图片
五:释放鼠标(鼠标还原变成小手)
Qt 自定义鼠标事件以及滚轮事件_第5张图片

你可能感兴趣的:(Qt,event,qt,qtcreator,c++)