在QT中,事件均派生自QEvent抽象类,事件可以由任何派生自QObject的子类实例接收和处理。它们与widget关联性极强。
当事件发生时,QT 通过构造适当的 QEvent 子类实例来创建一个事件对象来表示它,并通过调用其 event() 函数将其传递给 QObject 的特定实例
event() 函数本身不处理事件;它根据传递的事件类型,它会调用该特定类型事件的事件处理程序,并根据事件是被接受还是被忽略来发送响应。
传递的顺序如下:
大多数事件类型都有特殊的类,特别是 QResizeEvent、QPaintEvent、QMouseEvent、QKeyEvent 和 QCloseEvent。 每个类都是 QEvent 的子类并添加特定于事件的函数。 例如,QResizeEvent 添加了 size() 和 oldSize() 以使小部件能够发现它们的尺寸是如何改变的。
每个事件都有一个关联的类型,在 QEvent::Type 中定义,这可以用作运行时类型信息的方便来源,以快速确定给定事件对象是从哪个子类构造的。
具体的事件类型可参考,官网介绍
常用的事件处理方式如下:
重新实现 notify()函数是在事件过滤器得到所有事件之前获得它们的唯一方法
。事件过滤器使用更为便利。因为可以同时有多个事件过滤器。而 notify()函数只有一个。QT
自定义事件的创建步骤如下:
QT
中有两个宏用来定义了用户事件的最大边界(QEvent::MaxUser
)和最小边界(QEvent::User
)QT
事件系统注册自定义事件类型QT
事件系统中,这样若有相同的类型再次被注册时QT
事件系统就可以处理自定义事件类型冲突的问题。注册函数如下:// 线程安全
// registerEventType 若传入参数可用则返回此参数,否则返回QEvent::MaxUser和QEvent::User之间的值,若参数不在QEvent::MaxUser和QEvent::User之间则忽略参数
static int QEvent::registerEventType ( int hint = -1 );
#ifndef MYEVENT_H
#define MYEVENT_H#include class MyEvent : public QEvent
{
public:MyEvent();int getValue();static Type eventType;
private:int m_value;
};#endif // MYEVENT_H
#include "myevent.h"QEvent::Type MyEvent::eventType = (QEvent::Type)QEvent::registerEventType();
MyEvent::MyEvent(): QEvent(eventType),m_value(1)
{
}int MyEvent::getValue()
{return m_value;
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();virtual bool event(QEvent *event) override;
protected:// 自定义事件的处理(专门处理自定义事件的),也可以用event()函数处理virtual void customEvent(QEvent *event) override;
private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myevent.h"
#include MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);MyEvent* myEvent = new MyEvent;// 事件只能定义在堆上,不用手动释放,系统会自动释放qApp->postEvent(this,myEvent);
}MainWindow::~MainWindow()
{delete ui;
}bool MainWindow::event(QEvent *event)
{QEvent::Type eventType = event->type();if(eventType == MyEvent::eventType){MyEvent* myEvent = dynamic_cast(event);qDebug() << "event" << eventType ;qDebug() << "event" << myEvent->getValue() ;event->ignore();}// 处理完成后继续传播事件,这样customEvent就会收到自定义事件return QObject::event(event);
}void MainWindow::customEvent(QEvent *event)
{QEvent::Type eventType = event->type();if(eventType == MyEvent::eventType){// 这里默认是trueqDebug() << "customEvent" << event->isAccepted();MyEvent* myEvent = dynamic_cast(event);qDebug() << "customEvent" << eventType ;qDebug() << "customEvent" << myEvent->getValue() ;//event->accept();}
}
event()处理事件的时机比customEvent()处理的早
上一篇:电子采购一体化解决方案