Qt之事件过滤器 截获消息通知 自定义消息处理事件解析.

QEvent::Type:写在最前面.

这个枚举类型定义了Qt中有效的事件类型。事件类型和每个类型的专门类如下:

  • QEvent::None - 不是一个事件。
  • QEvent::Accessibility - 可存取性信息被请求。
  • QEvent::Timer - 规则的定时器事件,QTimerEvent
  • QEvent::MouseButtonPress - 鼠标按下,QMouseEvent


事件过滤器:<适合于过滤掉相关控件的一些行为.>

#include "mainwindow.h"

#include <QEvent>
#include <QPushButton>
 
 
#include <QDebug>
 
 
/*
    备注:这个是事件过滤器相关操作.
*/
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
   //  KeyPressEater *keyPressEater = new KeyPressEater(this);
     pushButton = new QPushButton(this);
 
 
     pushButton->setGeometry(30,30,40,30);
     pushButton->setText("Push Me");
     pushButton->installEventFilter(this);
 
     connect(pushButton,SIGNAL(clicked()),SLOT(ButtonDown()));
//这句话意思就是给button这个对象安装一个消息过滤器,this.通俗化来讲,button的相关事件,要转接给this的eventFilter处理了.(去掉下面这个语句前后比较不同即可)
     pushButton->installEventFilter(this);
 
}
 
MainWindow::~MainWindow()
{
 
}
 
 
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
	//这种形式组合成就屏蔽按钮功能.
    if(event->type() == QEvent::MouseButtonPress && obj == pushButton)
    {
        qDebug()<<"Shield Button";
        return true;
    }
    return QObject::eventFilter(obj, event);
}
 
void MainWindow::ButtonDown()
{
    qDebug()<<"Button is downd";
}
 
截获消息通知:<说白了就是重写框架窗口的Event函数,判断屏蔽过滤掉mousePressEvent函数过程>
//重写这个事件,使窗口能响应鼠标左键事件
void MainWindow::mousePressEvent(QMouseEvent *e)
{
    qDebug()<<"this is mouse event";
}
//添加消息过程:也就是重写Event函数:就能屏蔽掉mousePressEvent这个函数的响应.
bool MainWindow::event(QEvent *event)
{
   if(event->type() == QEvent::MouseButtonPress)
    {
        qDebug()<<"shield the mousePress";
        return true;
    }
    return QMainWindow::event(event);
}
/*                   分界线:这里紧接第二点进行理解,也可不看,侧重运用就看前面那个截获消息通知就可以了                                          */
编写代码进行测试,控件相关的消息通知不会转接给event进行转发.
#include "mainwindow.h"
#include <QEvent>
#include <QPushButton>
#include <QDebug>
/*
    备注:这个是事件过滤器相关操作.
*/
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    i = 0;
   //  KeyPressEater *keyPressEater = new KeyPressEater(this);
     pushButton = new QPushButton(this);
     pushButton->setGeometry(30,30,40,30);
     pushButton->setText("Push Me");
     pushButton->installEventFilter(this);
     connect(pushButton,SIGNAL(clicked()),SLOT(ButtonDown()));
     pushButton->installEventFilter(this);
}
MainWindow::~MainWindow()
{
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() == QEvent::MouseButtonPress && obj == pushButton)
    {
        i++;
        qDebug()<<i;
        qDebug()<<"Shield Button";
      /*去掉return 进行查看i的值一下就明白了*/
        return true;
    }
    return QObject::eventFilter(obj, event);
}
void MainWindow::ButtonDown()
{
    qDebug()<<"Button is downd";
}
bool MainWindow::event(QEvent *event)
{
    if(event->type() == QEvent::MouseButtonPress)
    {
        i++;
        qDebug()<<i;
    }
    return QMainWindow::event(event);
}

第三部分:自定义消息处理事件<实现类似C++中post,send message>
自定义事件:
通过QEvent::Type指定事件类型的值,然后new一个该类型的自定义事件,如:
1	const QEvent::Type MyEvent = (QEvent::Type)9393;
2	QApplication::postEvent(object, new QCustomEvent(MyEvent));
【QCustomEvent类是Qt3中的类,现在已经不推荐使用了。】
QEvent::Type是Qt中的枚举类型,Qt定义了一大堆的库事件类型常数值,当然也允许用户自定义自己的事件类型值,但是自定义的值应大于1000(QEvent::User),
且小于65535(QEvent::MaxUser).方便起见,可以使用int QEvent::registerEventType ( int hint = -1 ) [static]函数注册和保留一个自定义的事件类型值,
这样可以避免不小心重复使用了同一个事件类型值,它保证每次得到一个未被使用的事件类型常数值,该函数是线程安全的.
后面这个例子在补充,registerEventType利用注册进行就会比较"安全",也就是不要用宏定义做法.
然后,QApplication对象调用postEvent投递,在event函数中进行处理.参数决定,估计也可以投递给其它.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值