qt鼠标事件

一:qt的鼠标事件包含头文件 <QMouseEvent>

二:qt鼠标事件需要重写虚函数

(1):鼠标移动事件(需捕捉到鼠标后,才可以打印坐标,在QWidget内点击鼠标后,就可以捕捉到鼠标)

void mouseMoveEvent(QMouseEvent *event);
void Widget::mouseMoveEvent(QMouseEvent *event)
{
    QPoint p_ab = event->globalPos();//相对于整个桌面的位置
    QPoint p_re = event->pos();//相对于Widget窗口内的位置
    
    QString str1, str2;
    str1 = QString("%1 , %2").arg(p_ab.x()).arg(p_ab.y());//存放相对于整个桌面的x,y坐标
    str2 = QString("%1 , %2").arg(event->x()).arg(event->y());//存放相对于Widget的x,y坐标
    //str2 = QString("%1 , %2").arg(p_re.x()).arg(p_re.y());//存放相对于Widget的x,y坐标,与上面等价
    qDebug() << str1 << " | " << str2 << endl;
}

(2):持续捕捉鼠标事件(持续捕捉鼠标事件,不用按下鼠标,只要鼠标在QWidget内移动,就可以捕捉)

鼠标移动事件,只要移动鼠标,就会触发这个函数,其中,正常情况下,只有当鼠标在QWidget界面点击鼠标后,才会捕捉到鼠标的坐标,那如何实现,在不点击鼠标的情况下,也可以捕捉到鼠标移动事件呢?

代码如下:

//QWidget的构造函数
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //添加如下代码
    this->setMouseTracking(true);//持续捕捉鼠标事件,不用按下鼠标也可以捕捉到;
}

(3):鼠标点击事件(左键点击,右键点击)

void mousePressEvent(QMouseEvent *event);
void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() & Qt::LeftButton)
    {
        qDebug() << "鼠标左键按下" << endl;
    }
    else if(event->button() & Qt::RightButton)
    {
        qDebug() << "鼠标右键按下" << endl;
    }
}

(4):鼠标释放事件(左键释放,右键释放)

void mouseReleaseEvent(QMouseEvent *event);
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button() & Qt::LeftButton)
    {
        qDebug() << "鼠标左键释放" << endl;
    }
    else if(event->button() & Qt::RightButton)
    {
        qDebug() << "鼠标右键释放" << endl;
    }
}

(5):鼠标双击事件(左键双击,右键双击)

void mouseDoubleClickEvent(QMouseEvent *event);
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
    if(event->button() & Qt::LeftButton)
    {
        qDebug() << "鼠标左键双击" << endl;
    }
    else if(event->button() & Qt::RightButton)
    {
        qDebug() << "鼠标右键双击" << endl;
    }
}

(6):滚轮事件(只涉及了鼠标滚轮的滚动,不涉及鼠标滚轮的按下)

void wheelEvent(QWheelEvent *event);
void Widget::wheelEvent(QWheelEvent *event)
{
    if(event->delta() > 0)
    {
        qDebug() << "滚轮远离使用者" << endl;
    }
    else if(event->delta() < 0)
    {
        qDebug() << "滚轮靠近使用者" << endl;
    }
}

三,鼠标与窗口(还未实验,需要考证)

(1):进入窗口区域事件(还未实验,需要考证)

比如在主窗口QWidget下有一个父窗口Lable,在鼠标进入Lable窗口时,就会触发此函数

void MyLabel::enterEvent(QEvent *)
{
    QString text=QString("<center><h1>Mouse enter</h1></center>");
    this->setText(text);
}

(2):离开窗口区域事件(还未实验,需要考证)

void MyLabel::leaveEvent(QEvent *){
    QString text=QString("<center><h1>Mouse leave</h1></center>");
    this->setText(text);
}