一.Qt事件处理

A.图形界面应用程序的消息处理模型 B.Qt平台将系统产生的消息转换为Qt事件 1.Qt事件是一个QEvent的对象 2.Qt事件用于描述程序内部或外部发生的动作 3.任意的QObject对象都具备事件处理的能力 C.GUI应用程序的事件处理方式 1.Qt事件产生后立即被分到QWidget对象 2.QWidget中的event(QEvent*)进行事件处理 3.event()根据事件类型调用不同的事件处理函数 4.在事件处理函数中发送Qt预定义的信号 5.调用信号关联的槽函数 场景分析 QPushButton事件处理分析 1.接收到鼠标事件 2.调用event(QEvent*)成员函数 3.调用mouseReleaseEvent(QMouseEvent*)成员函数 4.调用click()成员函数 5.触发SIGNAL(clicked()) 代码示例--自定义事件

QMyPushButton.cpp
#include "QMyPushButton.h"
#include <QMouseEvent>

QMyPushButton::QMyPushButton(QWidget* parent, QButtonListener* listener) : QPushButton(parent)
{
    m_listener = listener;
}

void QMyPushButton::mouseReleaseEvent(QMouseEvent *e)
{
    if( m_listener != NULL )
    {
        m_listener(this, e);

        e->accept();

        setDown(false);
    }
    else
    {
        QPushButton::mouseReleaseEvent(e);
    }
}

QMyPushButton.h
#ifndef QMYPUSHBUTTON_H
#define QMYPUSHBUTTON_H

#include <QPushButton>

typedef void (QButtonListener)(QObject*, QMouseEvent*);

class QMyPushButton : public QPushButton
{
    Q_OBJECT
protected:
    QButtonListener* m_listener;

    void mouseReleaseEvent(QMouseEvent *e);
public:
    explicit QMyPushButton(QWidget* parent = 0, QButtonListener* listener = 0);

signals:

public slots:

};
#endif // QMYPUSHBUTTON_H

Widget.cpp
#ifndef QMYPUSHBUTTON_H
#define QMYPUSHBUTTON_H

#include <QPushButton>

typedef void (QButtonListener)(QObject*, QMouseEvent*);

class QMyPushButton : public QPushButton
{
    Q_OBJECT
protected:
    QButtonListener* m_listener;

    void mouseReleaseEvent(QMouseEvent *e);
public:
    explicit QMyPushButton(QWidget* parent = 0, QButtonListener* listener = 0);

signals:

public slots:

};
#endif // QMYPUSHBUTTON_H

Widget.h
#ifndef QMYPUSHBUTTON_H
#define QMYPUSHBUTTON_H

#include <QPushButton>

typedef void (QButtonListener)(QObject*, QMouseEvent*);

class QMyPushButton : public QPushButton
{
    Q_OBJECT
protected:
    QButtonListener* m_listener;

    void mouseReleaseEvent(QMouseEvent *e);
public:
    explicit QMyPushButton(QWidget* parent = 0, QButtonListener* listener = 0);

signals:

public slots:

};
#endif // QMYPUSHBUTTON_H

运行的结果以及按钮释放时的打印结果如图所示 D.事件和信号不同 1.事件由具体对象进行处理 2.信号由具体对象主动产生 3.改写事件处理函数可能导致程序行为发生改变 4.信号是否存在对应的槽函数不会改变程序行为 5.一般而言,信号在具体的事件处理函数中产生 E.事件的传递过程 QEvent中的关键成员函数 1.void ignore()--接收者忽略当前事件,事件可能传递给父组件 2.void accept()--接收者期望处理当前事件 3.bool isAccepted()--判断当前事件是否被处理 代码生成的结果运行如图所示 F.Qt中的事件过滤 1.事件过滤器可以对其他组件接收到的事件进行监控 2.任意的QObject对象都可以作为事件过滤器使用 3.事件过滤器对象需要重写eventFilter()函数 组件通过installEventFilter()函数安装事件过滤器 1.事件过滤器在组件之前接收到事件 2.事件过滤器能够决定是否将事件转发到组件对象 基本的代码实现 小结 1.Qt事件和信号不同 2.事件由QObject的对象进行处理 3.信号由QObject对象触发 4.重写事件处理函数可能该变程序行为 5.信号的触发不会对程序行为造成影响 6.事件处理实在实际工程开发中的应用非常普遍