Qt:65---事件处理(键盘事件、鼠标事件、滚轮事件、事件过滤器)

什么是事件?

  • 事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通 称。在Qt中使用一个对象来表示一个事件,它继承QEvent

事件处理:

  • 重写相关的Event函数,重新实现事件的paintEvent(),mousePressEvent()等事件处理函数

  • 安装事件过滤器,可以在一个界面类中同时处理不同子 部件的不同事件

  • Q_UNUSED(event);  //消除警告,如果事件在函数中没有使用,系统会发出警告

一、键盘事件

  • QKeyEvent类:描述一个键盘事件。当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输入焦点的部件
//相关函数
key(); //获取键盘对应的键值,不区分大小写

①按键按下事件

  • 虚函数:keyPressEvent
//成员函数
protected:
    virtual void keyPressEvent(QKeyEvent *event);
//演示键盘按下操作
void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_T) //如果键值为T
    {
        qDebug() <<"Ctrl + Key_T  is pressed";
    }
    else if(event->key() == Qt::Key_Z) //如果键值为Z
    {
        qDebug() <<"Ctrl + Key_Z is pressed";
    }
}

按键抬起事件

  • 虚函数:keyReleaseEvent
//成员函数
protected:
    virtual void keyReleaseEvent(QKeyEvent *event);

③组合按键按下事件

  • 原理:组合按键需要借助Ctrl和Shift等按键,在Qt中又叫修饰按键(直译过来),这里需要使用QKeyEvent的modifiers()函数来获取它们

修饰键值如下图:

//演示Shift组合键
//modifiers()函数:用于获取修饰键值

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if(event->modifiers() == Qt::ShiftModifier)//先判断第一层按键
    {
        if(event->key() == Qt::Key_T)//如果再按下T
        {
            qDebug() <<"Shift + Key_T  is pressed";
        }
        else if(event->key() == Qt::Key_Z)//如果再按下Z
        {
            qDebug() <<"Shift + Key_Z is pressed";
        }
    }
}

二、鼠标事件(QMouseEvent)

QMouseEvent类:

  • 表示一个鼠标事件,当在窗口部件中按下抬起鼠标或者移动鼠标指针时,都会产生鼠标事件
//QMouseEvent常用函数
button(); //返回鼠标的事件值
x(); //返回X坐标
y(); //返回Y坐标
pos(); //返回X和Y坐标

鼠标单击、双击、移动事件虚函数:

 

  • 单击按下虚函数:mousePressEvent()
  • 单击抬起虚函数:mouseReleaseEvent()
  • 双击虚函数:mouseDoubleClickEvent()
  • 鼠标移动虚函数:mousePressEvent()
protected:
   virtual void mousePressEvent(QMouseEvent *event);
   virtual void mouseReleaseEvent(QMouseEvent *event);
   virtual void mouseDoubleClickEvent(QMouseEvent *event);
   virtual void mouseMoveEvent(QMouseEvent *event);

演示案例: 

//演示鼠标单击按下事件,抬起、双击事件更改函数名即可
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton) //左键
    {
        qDebug() << QStringLiteral("鼠标左键按下");
    }
    else if(event->button() == Qt::RightButton) //右键
    {
    qDebug() << QStringLiteral("鼠标右键按下");
    } 
    else if(event->button() == Qt::MiddleButton) //中键
    {
        qDebug() << QStringLiteral("鼠标中键按下");
    }
}

//演示打印鼠标移动坐标
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    QString str = QString(QStringLiteral("鼠标当前的坐标为:(%1 * %2)"))    \
                             .arg(event->pos().x()).arg(event->pos().y());
    qDebug() << str;
}

三、滚轮事件(QWheelEvent)

QWheelEvent类:

  • 表示鼠标滚轮事件,在这个类中主要是获取滚轮移动方向和距离
//常用函数:
delta() //获取滚轮移动的距离函数
  • 每当滚轮旋转一下,默认的是15度
  • 向上滚动,delta()函数返回正值
  • 向下滚动,delta()函数返回负值

滚轮事件虚函数:

  • wheelEvent()
protected:
    virtual void wheelEvent(QWheelEvent *event);

演示案例:  

//演示滚轮移动
void MainWindow::wheelEvent(QWheelEvent *event)
{
    if(event->delta() > 0) //deita()获取滚轮移动的距离
    {
        qDebug() << QStringLiteral("Wheel 往前");
    }
    else
    {
        qDebug() << QStringLiteral("Wheel 往后");
    }
}

四、鼠标事件追踪

  • setMouseTracking()://设置鼠标事件追踪,默认为false
  • 将setMouseTracking()设置为true,且只有配合鼠标按下时才追踪鼠标移动事件

五、事件过滤器

  • 概念:使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件。只要是对象或者部件安装了事件过滤器,就会进入事件过滤器函数

  • 使用:先通过installEventFilter()函数为控件安装一个过滤器,然后通过eventFilter()函数进行事件判断

  • 虚函数:eventFilter()。实现此虚函数,参数为控件对象与事件类型

protected:
    virtual bool eventFilter(QObject *watched, QEvent *event);
    //参数:1.接受事件的对象 2.事件类型

演示案例:

//演示一个QTextEdit过滤器

ui->textEdit->installEventFilter(this);
//在构造函数中为textEdit对象安装过滤器

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
     if(watched==ui->textEdit)//判断对象为哪一个
     {
        if (event->type()== QEvent::KeyPress)//判断事件类型(此处为按键按下)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);//将事件类型强转为键盘事件类型
            qDebug() << "Ate key press" << keyEvent->key();//得到键值并打印
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        //其他对象返回默认的事件过滤器
        return eventFilter(watched,event);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

董哥的黑板报

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值