新建一个项目:06Event

新建cpp文件

06Event.pro

HEADERS
+=
\

MyWidget.h

SOURCES
+=
\

MyWidget.cpp

QT
+=
widgets gui

MyWidget.h

#ifndef
MYWIDGET_H

#define
MYWIDGET_H

#include
<QWidget>

#include
<QPushButton>

#include
<QLineEdit>

class
MyWidget
:
public
QWidget

{

Q_OBJECT

public:

explicit
MyWidget(QWidget
*parent
);

bool
event(QEvent
*);

void
mousePressEvent(QMouseEvent
*);

void
mouseReleaseEvent(QMouseEvent
*);

void
mouseMoveEvent(QMouseEvent
*);

/*不要用,因为它默认调用两次mousePressEvent*/

//void
mouseDoubleClickEvent(QMouseEvent
*);

void
keyPressEvent(QKeyEvent
*);

void
keyReleaseEvent(QKeyEvent
*);

void
closeEvent(QCloseEvent
*);

//void
showEvent(QShowEvent
*);

//void
hideEvent(QHideEvent
*);

void
paintEvent(QPaintEvent
*);

QPushButton*
button;

QLineEdit*
edit;

signals:

public
slots:

void
slotButtonClicked();

};

#endif
//
MYWIDGET_H

MyWidget.cpp

#include "MyWidget.h"
#include <QApplication>
#include <QEvent>
#include <QDebug>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QVBoxLayout>
#include <QPainter>
 
MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
//  QVBoxLayout* lay = new QVBoxLayout(this);
#if 0
    QPushButton* button2;
    lay->addWidget(button = new QPushButton("OK", this));
    lay->addWidget(button2 = new QPushButton("Button2"));
    //设置它为默认的焦点,当点击tab键之后可以切换焦点
    button->setDefault(true);
 
    // 鼠标不需要按下,mouseMove就能得到调用
    this->setMouseTracking(true);
 
    connect(button2, SIGNAL(clicked()), this, SLOT(slotButtonClicked()));
    connect(button, SIGNAL(clicked()), this, SLOT(slotButtonClicked()));
#endif
//    lay->addWidget(edit = new QLineEdit());
//    connect(edit, SIGNAL(returnPressed()), this, SLOT(slotButtonClicked()));
}
 
//通过这一句实现点击按钮的时候获得按钮上的text()内容
void MyWidget::slotButtonClicked()
{
    QLineEdit* button = (QLineEdit*)sender();
    qDebug() << button->text();
}
 
/* QApplication先得到->具体应该处理的窗口::event()->event()根据消息类型来调用具体的虚函数 */
/* 1)可以重载具体的虚函数,来实现对消息的响应
   2)可以重载event函数,用来处理或者截取消息 */
 
/* 截取消息 */
bool MyWidget::event(QEvent *ev)
{
    // 鼠标消息被截断
   // if(ev->type() == QEvent::MouseButtonPress)
     //   return true;
    ev->accept();
 
    return QWidget::event(ev);
}
 
/**
 * @brief MyWidget::closeEvent 窗口关闭的事件
 */
void MyWidget::closeEvent(QCloseEvent *)
{
    qDebug() << "closeEvent";
}
 
void MyWidget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    //通过下面的方式实现画线
    p.drawLine(QPoint(0, 0), QPoint(100, 100));
}
 
/**
 * @brief MyWidget::mousePressEvent 鼠标按下的事件
 * @param ev
 */
void MyWidget::mousePressEvent(QMouseEvent *ev)
{
#if 0
    QPoint pt = ev->pos();
    qDebug() << pt;
    //如果鼠标按下的是左键的处理
    if(ev->button() == Qt::LeftButton){}
 
    //如果按下的Shift键了
    if(ev->modifiers() == Qt::ShiftModifier)
    {
        qDebug() << "shift press";
    }
#endif
    //改进办法:先判断是否有左键,然后如果判断是否还按了Ctrl键
    if(ev->button() == Qt::LeftButton)
    {
        if(ev->modifiers() == Qt::ControlModifier)
        {
            // handle with Control;
            return;
        }
        // handle2 without control;
    } else {}
}
 
/**
 * @brief MyWidget::mouseReleaseEvent 鼠标释放的按键
 */
void MyWidget::mouseReleaseEvent(QMouseEvent *){}
 
/**
 * @brief MyWidget::mouseMoveEvent 鼠标移动的事件
 */
void MyWidget::mouseMoveEvent(QMouseEvent *)
{
    static int i=0;
    qDebug() << "mouse move"<< i++;
}
 
/**
 * @brief MyWidget::keyPressEvent 鼠标按下的事件,通过这个可以获得按下的键
 * @param ev
 */
void MyWidget::keyPressEvent(QKeyEvent *ev)
{
    ev->modifiers();
    int key = ev->key();
    qDebug() << key;
    char a = key;
    qDebug() << (char)a;
}
 
/**
 * @brief MyWidget::keyReleaseEvent 按键释放的事件
 */
void MyWidget::keyReleaseEvent(QKeyEvent *){}
 
int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
 
    MyWidget w;
    w.show();
 
    return app.exec();
}
运行结果:


QT消息过滤器

EventFilter.pro

HEADERS
+=
\

MyWidget.h
\

MyApplication.h

SOURCES
+=
\

MyWidget.cpp
\

MyApplication.cpp

QT
+=
widgets gui

MyWidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H
 
#include <QWidget>
#include <QPushButton>
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent);
 
    QPushButton* _button;
    bool eventFilter(QObject *, QEvent *);
    bool event(QEvent *);
signals:
 
public slots:
 
};
 
#endif // MYWIDGET_H

MyWidget.cpp

#include "MyWidget.h"
#include <QPushButton>
#include <QEvent>
#include "MyApplication.h"
#include <QDebug>
#include <QApplication>
 
MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent)
{
    QPushButton* button;
 
    button = new QPushButton("This button", this);
    connect(button, SIGNAL(clicked()), this, SLOT(close()));
    _button = button;
 
    /*button给自己安装了一个消息过滤器,那么经过button的消息,
     * 都先要调用它的过滤器的eventFilter函数*/
    button->installEventFilter(this);
}
 
bool MyWidget::eventFilter(QObject *o, QEvent *e)
{
#if 0
    if(0 == (QObject*)_button &&(
                e->type() == QEvent::MouseButtonRelease ||
                e->type() == QEvent::MouseButtonDblClick ||
                e->type() == QEvent::MouseButtonPress)) {
        return true;
    }
#endif
 
    return QWidget::eventFilter(o,e);
}
 
bool MyWidget::event(QEvent *e)
{
    if(e->type() == QEvent::User)
    {
        qDebug() << "User event is comming";
    }
    return QWidget::event(e);
}
 
int main(int argc,char *argv[])
{
    MyApplication app(argc,argv);
    MyWidget w;
    w.show();
 
    //发送一个Event给MyWidget
    qDebug() << "begin send";
    app.postEvent(&w,new QEvent(QEvent::User));
    qDebug() << "end send";
 
    return app.exec();
}

MyApplication.h

#ifndef MYAPPLICATION_H
#define MYAPPLICATION_H
 
#include <QApplication>
 
class MyApplication : public QApplication
{
    Q_OBJECT
public:
    MyApplication(int argc,char *argv[]):QApplication(argc,argv)
    {}
    bool notify(QObject *,QEvent *);
 
signals:
 
public slots:
 
};
 
#endif // MYAPPLICATION_H

MyApplication.cpp

#include "MyApplication.h"
#include <QEvent>
 
#include <QDebug>
bool MyApplication::notify(QObject *o, QEvent *e)
{
    if(this->topLevelWidgets().count()>0)
    {
        QWidget* mainWnd = this->topLevelWidgets().at(0);
        if(o==(QObject*)mainWnd && e->type() == QEvent::MouseButtonPress)
        {
            // do ...
            qDebug() << "mainwnd is clicked";
        }
    }
 
    return QApplication::notify(o, e);
}

运行结果:

3.QT事件处理,消息过滤器的更多相关文章

  1. Qt事件处理机制

    研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多.后来由于项目的需要,也没有再接触Qt了.现在要重新拾起来,于是要从基础学起. Now,开始学习Qt事件处理机制. 先给出原文 ...

  2. 【转】Qt 事件处理机制 (下篇)

    转自:http://mobile.51cto.com/symbian-272816.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生.分 ...

  3. 9、Qt 事件处理机制

    原文地址:http://mobile.51cto.com/symbian-272812.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生 ...

  4. Qt 事件处理机制

    Qt 事件处理机制 因为这篇文章写得特别好,将Qt的事件处理机制能够阐述的清晰有条理,并且便于学习.于是就装载过来了(本文做了排版,并删减了一些冗余的东西,希望原主勿怪),以供学习之用. 简介 在Qt ...

  5. QT开发(十二)——QT事件处理机制

    一.QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下和松开 ...

  6. Qt 事件处理机制 (下篇)

    继续我们上一篇文章继续介绍,Qt 事件处理机制 (上篇) 介绍了Qt框架的事件处理机制:事件的产生.分发.接受和处理,并以视窗系统鼠标点击QWidget为例,对代码进行了剖析,向大家分析了Qt框架如何 ...

  7. 【转】解读Qt 事件处理机制(上篇)

    [转自]:http://mobile.51cto.com/symbian-272812.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生 ...

  8. Qt5学习笔记(消息过滤器)

    T06EventFilter.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += widgets gui MyWidget.h #i ...

  9. Qt 事件处理机制 (上篇)

    本篇来介绍Qt 事件处理机制 .深入了解事件处理系统对于每个学习Qt人来说非常重要,可以说,Qt是以事件驱动的UI工具集. 大家熟知Signals/Slots在多线程的实现也依赖于Qt的事件处理机制. ...

随机推荐

  1. wows

    [问题描述]山山最近在玩一款游戏叫战舰世界(steam 游戏太少了),他被大舰巨炮的魅力折服,于是山山开了一局游戏,这次发现目标是一艘战列舰新墨西哥级,舰桥很高,原本应该打在目标身后的圆形水域内的炮弹 ...

  2. [POJ 2104]K-th Number【模板】(主席树)

    题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...

  3. 计蒜客NOIP模拟赛(3)D2T1 小区划分

    一条街道的两侧各连续坐落着 N 座单元楼.现在要为这些单元楼划分居民校区. 规则如下: 每个小区只能由同一侧连续的若干座单元楼组成.且两侧都恰有 K 个小区(每个小区至少有一栋楼). 两侧的小区划分规 ...

  4. StopAllSounds

    10月3日,在杭州市西湖景区,一只小松鼠不停地接受一道道食物,花生.玉米.饼干,可谓来者不拒,憨态可掬的模样吸引了众多围观者...Description   小松鼠开心地在树之间跳跃着,突然她停了下来 ...

  5. [SCOI2012]滑雪与时间胶囊

    题目描述 a180285非常喜欢滑雪.他来到一座雪山,这里分布着MMM条供滑行的轨道和NNN个轨道之间的交点(同时也是景点),而且每个景点都有一编号iii(1≤i≤N1 \le i \le N1≤i≤ ...

  6. BZOJ1187 [HNOI2007]神奇游乐园(插头dp)

    麻麻我会写插头dp了! 推荐陈丹琦论文:https://wenku.baidu.com/view/3e90d32b453610661ed9f4bd.html 破题调一年 #include <cs ...

  7. 探索C++多态和实现机理

    前一段时间被问到过一个问题,当时模模糊糊,就是说不清楚,问题问到说:什么情况下会将基类的析构函数定义成虚函数? 当时想到 如果子类B继承了父类A,那么定义出一个子类对象b,析构时,调用完子类析构函数, ...

  8. LCD接口和RGB介绍【转】

    转自:https://www.cnblogs.com/hzl6255/p/5470583.html 阅读目录 1. 介绍 2. 接口类型 3. RGB 4. YUV 5. FOURCC 回到顶部 1. ...

  9. linux 下文件误删恢复

    linux 下文件误删恢复 0x01 事件背景 某天晚上写代码的时候,本来想删除当前目录下一个叫xxx的文件夹 rm -rdf ./xxx/*, 结果光顾着和人说话,一不留神手贱把命令敲成了rm -r ...

  10. 基于Spark环境对比Python和Scala语言利弊

    在数据挖掘中,Python和Scala语言都是极受欢迎的,本文总结两种语言在Spark环境各自特点. 本文翻译自  https://www.dezyre.com/article/Scala-vs-Py ...