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函数中进行处理.参数决定,估计也可以投递给其它.