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()<<"你按下了鼠标"; }
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(); }
以上工程下载地址:链接:https://pan.baidu.com/s/1LlVo3zICQo8xz75GchmV8A 提取码:6666
事件处理方式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(); }
以上工程下载地址:链接:https://pan.baidu.com/s/1paCGyWSCqFaJ6XC-UD5SGw 提取码:6666