Qt中的事件处理

1、Qt事件处理

A.图形界面应用程序的消息处理模型

 

B.Qt平台将系统产生的消息转换为Qt事件

1.Qt事件是一个QEvent的对象

2.Qt事件用于描述程序内部或外部发生的动作

3.任意的QObject对象都具备事件处理的能力

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

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.事件处理实在实际工程开发中的应用非常普遍

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值