[进阶]Qt使用鼠标

本文例程程序源码:公众号回复qt0004

本文例程可执行安装包:公众号回复qt0005

我们在各种界面中,都要用到鼠标事件。在PC端就是呈现为鼠标,在嵌入式端则呈现为触屏事件,这在Qt中具体实现也是鼠标事件。

Qt鼠标事件是通过重载对应的事件函数来实现,所以我们不必要纠结过分的底层,只需要构建好自己的逻辑就可以了。

我们将有关于鼠标的事件统称为鼠标事件,细化可分为鼠标按下事件、鼠标双击事件、鼠标移动事件、鼠标松开事件以及鼠标滚轮事件,本文会一一讲解并通过代码实现。

我认为授人以鱼不如授人以渔,我会给出本文讲解所使用的代码,但是都是一些简单的例子,这更有利于学习的朋友们理解本文的主题,使用很复杂的工程反而不利于学习。

一、鼠标按下事件

事件函数:void mousePressEvent(QMouseEvent *e);

按下事件可分为左键按下、右键按下滚轮按下事件,按下后可获得鼠标在界面中的信息,我们在本次实验中获取的是鼠标在界面中的坐标信息,具体实现是在头文件中包含

扫描二维码关注公众号,回复: 9778401 查看本文章
void mousePressEvent(QMouseEvent *e);

在.cpp文件中就可以写我们的逻辑

void MouseTest::mousePressEvent(QMouseEvent *e)//按下事件
{
    if(e->button() == Qt::LeftButton)//左键
    {
        QString sText = "左键";
        sText.append(QString("(%1,%2)").arg(e->x()).arg(e->y()));
        ui->textBrowser->append(sText);
    }
    else if(e->button() == Qt::RightButton)//右键
    {
        QString sText = "右键";
        sText.append(QString("(%1,%2)").arg(e->x()).arg(e->y()));
        ui->textBrowser->append(sText);
    }
    else if(e->button() == Qt::MidButton)//滚轮键
    {
        QString sText = "滚轮";
        sText.append(QString("(%1,%2)").arg(e->x()).arg(e->y()));
        ui->textBrowser->append(sText);
    }
}

我们在界面中非显示区域点击鼠标即可获得坐标信息

二、鼠标双击事件

事件函数:void mouseDoubleClickEvent(QMouseEvent *e);

我们在日常生活中遇到的鼠标双击都是使用左键双击,你可以使用上面的方式来判断我们按下的键。当然,鼠标双击一定是有按下事件的,就是单击,只有按下的第二次才会被判别为双击,这是我们要注意的地方。在头文件中包含

void mouseDoubleClickEvent(QMouseEvent *e);

具体逻辑在对应.cpp文件中实现

void MouseTest::mouseDoubleClickEvent(QMouseEvent *e)//双击事件
{
    QString sText = "双击";
    sText.append(QString("(%1,%2)").arg(e->x()).arg(e->y()));
    ui->textBrowser->append(sText);
}

我们可以看到如下效果


三、鼠标移动以及松开事件

移动事件函数:void mouseMoveEvent(QMouseEvent *e);

松开事件函数:void mouseReleaseEvent(QMouseEvent *e);

移动事件是在按下鼠标后,鼠标在界面中移动的过程中所读取的内容。

鼠标松开事件是当我们鼠标键位被按下松开,都会跳入的事件,不要因为我和移动事件写在一起就认为只有在移动过后才可以跳入该事件。

头文件中包含

void mouseMoveEvent(QMouseEvent *e);

在对应.cpp中实现具体逻辑​​​

void MouseTest::mouseMoveEvent(QMouseEvent *e)//移动事件
{
    QString sText = "移动";
    sText.append(QString("(%1,%2)").arg(e->x()).arg(e->y()));
    ui->textBrowser->append(sText);
}
void MouseTest::mouseReleaseEvent(QMouseEvent *e)//松开事件
{
    QString sText = "松开";
    sText.append(QString("(%1,%2)").arg(e->x()).arg(e->y()));
    ui->textBrowser->append(sText);
}

具体呈现效果如下

四、鼠标滚轮滑动事件

事件函数:void wheelEvent(QWheelEvent *e);

我们通过读取angleDelta返回的的轮子走过的距离,来完成判定,具体的值为度的1/8,返回的值为正表示向前滑动滚轮,负为向后滑动滚轮。在头文件中包含

void wheelEvent(QWheelEvent *e);

在对应.cpp中实现逻辑

void MouseTest::wheelEvent(QWheelEvent *e)//滚轮滑动
{
    QString sText = "滚轮";
    sText.append(QString("(%1,%2 %3°)").arg(e->x()).arg(e->y()).arg(e->angleDelta().y()));
    ui->textBrowser->append(sText);
    qDebug()<<e->angleDelta();
}

呈现效果如下

发布了33 篇原创文章 · 获赞 46 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Groot_Lee/article/details/104805035