Qt自定义事件
Qt 5.10.1
介绍QEvent
QEvent
类是所有事件类的基类。事件对象包含事件参数。
Qt的主事件循环(QCoreApplication::exec()
)从事件队列中获取本地窗口系统事件,将它们封装进QEvent
中,并且将封装好的事件发送给QObjects
。
一般情况下,事件来源于底层的窗口系统(spontaneous()
返回true),但是通过使用QCoreApplication::sendEvent()
和 QCoreApplication::postEvent()
人工发送事件也是可以的(spontaneous()
返回false)。
QObjects
通过它们的QObject::event()
方法被调用来接收事件。该方法可以在子类中被重写以自定义事件处理器和额外的事件类型;QWidget::event()
是一个需要注意的示例。默认情况下,事件都被分发给类似QObject::timerEvent()
、QWidget::mouseMoveEvent()
的事件处理器。QObject::installEventFilter()
允许一个对象拦截发送给目标对象的事件。
基本的QEvent
仅仅包含一个事件类型参数和一个"accept"标志。"accept"标志可以通过accept()来设置,也可以通过
ignore()
清除。默认情况下该标志是被设置的,但是我们不能依赖于这一点,因为有的子类可能会选择在子类构造器中清除
该标志。
用户事件的值必须在User和MaxUser之间:
Constant | Value | Description |
---|---|---|
QEvent::User | 1000 | User-defined event |
QEvent::MaxUser | 65535 | Last user event ID |
可以使用registerEventType()
函数来为你的应用程序注册和保留一个自定义事件类型。这样做可以使你避免在你的应用程序中偶然重复使用一个已在应用程序其它地方使用的自定义事件类型。
成员函数
函数 | 描述 |
---|---|
accept () | 设置事件对象的"accept"标志,等价于调用setAccepted(true),事件不会继承传递。 |
ignore () | 清除事件对象的"accept"标志,等价于调用setAccepted(false),事件继承传递给下一个事件接受者。 |
registerEventType ( int hint = -1 ) | 注册并返回一个自定义的事件类型。提供的hint参数如果可用则会被采用,否则该函数会返回一个介于QEvent::User 和QEvent::MaxUser 且还没有被注册的值。如果hint参数的值不在QEvent::User 和QEvent::MaxUser 之间,那么它会被忽略。 |
spontaneous () | 如果事件源在应用程序之外(一个系统事件)则该函数返回true,否则返回false。 |
type () | 返回事件的类型。 |
应用实例
customevent.h
#ifndef CUSTOMEVENT_H
#define CUSTOMEVENT_H
#include <QEvent>
#include <QObject>
class CustomEvent : public QEvent
{
public:
CustomEvent(QString msg);
//注册一个可用的事件ID
static Type registerType()
{
static Type EventType = static_cast<Type>(registerEventType(-1));
return EventType;
}
QString getMessage() const;
void setMessage(const QString &value);
private:
//事件包含的信息
QString message;
};
#endif // CUSTOMEVENT_H
customevent.cpp
#include "customevent.h"
CustomEvent::CustomEvent(QString msg):QEvent(registerType())
{
message = msg;
}
QString CustomEvent::getMessage() const
{
return message;
}
void CustomEvent::setMessage(const QString &value)
{
message = value;
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <customevent.h>
#include <QDebug>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
public:
bool event(QEvent *event);
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//当事件发送后立即返回,事件将会发送到事件队列中等待处理(非阻塞)
//new分配的事件对象被处理后,会由Qt内部自动摧毁
CustomEvent *postcustomevent = new CustomEvent("postevent");
qApp->postEvent(this,postcustomevent);
//当事件发送后,将会立即进入event()事件处理函数进行事件处理(阻塞)
//new分配的事件对象被处理后,会由Qt内部自动摧毁
CustomEvent *sendcustomevent = new CustomEvent("sendevent");
qApp->sendEvent(this,sendcustomevent);
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::event(QEvent *event)
{
if(event->type() == CustomEvent::registerType())
{
CustomEvent *ce = static_cast<CustomEvent *>(event);
qDebug() << ce->getMessage();
}
return QMainWindow::event(event);
}