什么是事件?
- 事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通 称。在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);
二、鼠标事件(QMouseEvent)③组合按键按下事件
- 原理:组合按键需要借助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常用函数 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);
三、滚轮事件(QWheelEvent)演示案例:
//演示鼠标单击按下事件,抬起、双击事件更改函数名即可 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类:
- 表示鼠标滚轮事件,在这个类中主要是获取滚轮移动的方向和距离
//常用函数: 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); } }