Qt事件处理的方式

cpp文件

#include "win.h"
#include "ui_win.h"

Win::Win(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Win)
{
    ui->setupUi(this);
}

Win::~Win()
{
    delete ui;
}

bool Win::event(QEvent *e)
{
    static int i=0; //i 用于计数
    qDebug()<<"E捕获到事件:"<<i++; //验证该函数能在事件到达目标对象之前被捕获
    if(e->type()==QEvent::KeyPress){  //处理指定事件
        qDebug()<<"你按下了键盘";
    }
    return QWidget::event(e); //把其它事件返回给基类
    /*此处应调用父类的 event 函数以对未处理的事件进行处理,若此处不
    调用父类的 event,则本例 mousePressEvent 处理函数中的内容将不会
    被执行。读者可使此处返回 1 或者 0 进行验证。*/

}

void Win::mousePressEvent(QMouseEvent *e)
{
    qDebug()<<"你按下了鼠标";
}

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

h文件

#ifndef WIN_H
#define WIN_H

#include <QWidget>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Win; }
QT_END_NAMESPACE

class Win : public QWidget
{
    Q_OBJECT

public:
    Win(QWidget *parent = nullptr);
    ~Win();
    bool event(QEvent* e); //事件处理方式1:重写虚函数QObject::event()
    //事件是由顶层基类QObject的event函数来捕获的

    void mousePressEvent(QMouseEvent* e);  //事件处理方式2:重写基类中的虚函数
    //这是Qt中最简单的事件处理方式

private:
    Ui::Win *ui;
};


#endif // WIN_H

main文件

#include "win.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Win w;
    w.show();
    return a.exec();
}

事件处理方式3:重写notify(事件分发)函数

AA.h文件

#ifndef AA_H
#define AA_H

#include <QApplication>
#include <QDebug>

class AA : public QApplication
{
public:
    AA(int i,char *p[]):QApplication(i,p){};
    /*Qt处理事件的方式之3:”继承 QApplication 并重新实现 notify()函数”。
     Qt 调用 QApplication 来发送一个事件,重新实现 notify()函数是在事件过滤器得到所有事件之前获得它们的唯一方法。
    事件过滤器使用更为便利。因为可以同时有多个事件过滤器。而 notify()函数只有一个*/
    bool notify(QObject *o,QEvent *e); //重写虚函数 notify



};

#endif // AA_H

AA.cpp文件

#include "aa.h"

bool AA::notify(QObject *o, QEvent *e)
{
    static int i=0;
    qDebug()<<"AA-N"<<i++;
    if(o->objectName()=="ma"&&e->type()==QEvent::MouseMove){
        qDebug()<<"你移动了鼠标";

    }
    return QApplication::notify(o,e);
}

win.h

#ifndef WIN_H
#define WIN_H

#include <QWidget>
#include <QDebug>

class Win : public QWidget
{
    Q_OBJECT

public:
    Win(QWidget *parent = nullptr);
    ~Win();

    bool event(QEvent* e); //重写虚函数 QObject::event()

};
#endif // WIN_H

win.cpp

#include "win.h"

Win::Win(QWidget *parent)
    : QWidget(parent)
{
}

Win::~Win()
{
}

bool Win::event(QEvent *e)
{
    qDebug()<<"winE事件";  //用于验证该函数是否被执行
    return QWidget::event(e);
}

main.cpp

#include "win.h"
#include "aa.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    AA a(argc, argv);
    Win ma;
    ma.setObjectName("ma");
    ma.resize(300,200);
    ma.show();
    return a.exec();
}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值