一、事件处理过程
众所周知
Qt
是一个基于
C++
的框架,主要用来开发带窗口的应用程序(不带窗口的也行,但不是主流)。
我们使用的基于窗口的应用程序都是基于事件,其目的主要是用来实现回调(因为只有这样程序的效率才是最高的)。所以在Qt
框架内部为我们提供了一些列的事件处理机制,当窗口事件产生之后,事件会经过: 事件派发
->
事件过滤
->
事件分发
->
事件处理
几个阶段。
Qt
窗口中对于产生的一系列事件都有默认的处理动作,如果我们有特殊需求就需要在合适的阶段重写事件的处理动作,
比如信号与槽就是一种
事件(
event
)是由系统或者
Qt
本身在不同的场景下发出的。当用户按下
/
移动鼠标、敲下键盘,或者是窗口关闭/
大小发生变化
/
隐藏或显示都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如鼠标/
键盘事件等;另一些事件则是由系统自动发出,如计时器事件。
每一个
Qt
应用程序都对应一个唯一的
QApplication
应用程序对象,然后调用这个对象的
exec()
函
数,这样
Qt
框架内部的事件检测就开始了(
程序将进入事件循环来监听应用程序的事件
)。
int main ( int argc , char * argv []){QApplication a ( argc , argv );MainWindow * w = new MainWindow ;w . show ();return a . exec ();}
事件在
Qt
中产生之后的分发过程是这样的:
1.
当事件产生之后,
Qt
使用用应用程序对象调用
notify()
函数将事件发送到指定的窗口:
[ override virtual ] bool QApplication::notify ( QObject * receiver , QEvent * e );
2. 事件在发送过程中可以通过事件过滤器进行过滤,默认不对任何产生的事件进行过滤。
// 需要先给窗口安装过滤器 , 该事件才会触发[ virtual ] bool QObject::eventFilter ( QObject * watched , QEvent * event )
3. 当事件发送到指定窗口之后,窗口的事件分发器会对收到的事件进行分类
[ override virtual protected ] bool QWidget::event ( QEvent * event );
4.
事件分发器会将分类之后的事件(鼠标事件、键盘事件、绘图事件。。。)分发给对应的事件处理器函数进行处理,每个事件处理器函数都有默认的处理动作(我们也可以重写这些事件处理器函
数),比如:鼠标事件:
// 鼠标按下[ virtual protected ] void QWidget::mousePressEvent ( QMouseEvent * event );// 鼠标释放[ virtual protected ] void QWidget::mouseReleaseEvent ( QMouseEvent * event );// 鼠标移动[ virtual protected ] void QWidget::mouseMoveEvent ( QMouseEvent * event );
二、重写事件案例
程序关闭之前的询问,鼠标进入,鼠标离开,窗口大小改变
widget.h中代码
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
void enterEvent(QEvent *event) override;
void leaveEvent(QEvent *event) override;
void wheelEvent(QWheelEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp中代码
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <qevent.h>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::enterEvent(QEvent *event)
{
qDebug() << "mouse enter";
}
void Widget::leaveEvent(QEvent *event)
{
qDebug() << "mouse leave";
}
void Widget::wheelEvent(QWheelEvent *event)
{
qDebug()<<event->angleDelta().y();
}
void Widget::resizeEvent(QResizeEvent *event)
{
qDebug() << "oldSize:" << event->oldSize()
<< "newSize:" << event->size();
}