QEvent类

QEvent 类是所有事件类的基类。事件对象包含事件参数。


Header:#include <QEvent>
CMake:find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake:QT += core
Inherited By:

QActionEvent

QChildEvent

QCloseEvent

QDragLeaveEvent

QDropEvent 

QDynamicPropertyChangeEvent

QExposeEvent

QFileOpenEvent

QFocusEvent

QGestureEvent

QGraphicsSceneEvent >

QHelpEvent

QHideEvent

QIconDragEvent 

QInputEvent

QInputMethodEvent

QInputMethodQueryEvent

QMoveEvent

QPaintEvent >

QPlatformSurfaceEvent

QResizeEvent

QScrollEvent

QScrollPrepareEvent

QShortcutEvent 

QShowEvent

QStateMachine::SignalEvent

QStateMachine::WrappedEvent

QStatusTipEvent

QTimerEvent

QWhatsThisClickedEvent

QWindowStateChangeEvent


【详细描述】

Qt主事件循环(QCoreApplication::exec()) 从事件队列中获取本地窗口系统事件,将它们转换为QEvent,并将转换后的事件发送到各 QObject

Qt中的事件会经过:派发 -> 过滤 -> 分发 -> 处理,4个阶段。

Qt对窗口中发生的事件有一系列的默认处理动作,用户可以在适当位置重写这些事件虚函数。

每个Qt应用程序都有一个唯一的QApplication应用程序对象,继承于QCoreApplication,调用它的exec()函数,便开启了Qt框架内部的事件循环机制。

int main(int argc,char* argv[])
{
    QApplication a(argc,argv);  //有且唯一的应用程序对象
    MainWindow* w = new MainWindow; 
    w.show();
    return a.exec();            //开启消息循环机制,进行事件的派发
}

Qt中产生事件后通过如下过程分发:

1.【派发】当事件产生后,通过QApplication应用程序对象调用重写的虚函数notify()将事件分发到指定的窗口:

//QObject *receiver 指向事件接收者,QEvent *e 指向产生的事件
[override virtual] bool QApplication::notify(QObject *receiver,QEvent *e)

2.【过滤】事件发送过程中,可以通过事件过滤器eventFilter()进行过滤,默认不过滤任何事件。

//QObject *watched指向要过滤事件的对象,QEvent *event指向要被过滤的事件
[virtual]bool QQbject::eventFilter(QObject *watched,QEvent *event)

3.【分发】未被过滤的事件会发送到指定的窗口,窗口的事件分发器event()会对收到的事件进行分类,并调用对应的事件处理器函数:

//QEvent *event指向应用程序派发且未被过滤的事件,分类后转给事件处理函数
[override virtual protected] bool QWidget::event(QEvent *event)

4.【处理】分类后的事件会交由对应的事件处理器函数,每个事件处理函数都有默认的处理动作,用户也可以重写这些事件处理函数,例如:

//鼠标按下
void QWidget::mousePressEvent(QMouseEvent *event)
//鼠标释放
void QWidget::mouseReleaseEvent(QMouseEvent *event)
//鼠标移动
void QWidget::mouseMoveEvent(QMouseEvent *event)
  • 上述事件处理函数都是“回调”函数,其调用过程由Qt框架完成,无需程序员干预。
  • 上述4个环节中事件处理器函数经常由程序员重写,以实现具体功能,它们主要分布在两个位置QObject类和QWidget类,前者只有一个timerEvent()定时器虚函数,后者有二十多个

通常,事件来自底层窗口系统 (系统事件,spontaneous() 返回真),但也可以使用 QCoreApplication::sendEvent()和QCoreApplication::postEvent() (应用程序内部事件,spontaneous() 返回假)。

QObjects 通过调用事件的 QObject::event() 函数来接收事件,该函数可以在子类中重新实现,以便自定义事件处理并添加其他事件类型。

★ QObjects 默认情况下,事件被调度给事件处理程序,如  QObject::timerEvent() 和 QWidget::mouseMoveEvent()。

QObject::installEventFilter() 允许一个对象截获发往另一个对象的事件。

QEvent 仅包含一个事件类型参数和一个“accept”标志,可以使用  accept() 设置或使用 ignore() 清除的 accept 标志。

accept 是默认设置的,但不要依赖它,因为子类可能会选择在其构造函数中清除它。

参阅 QObject::event(), QObject::installEventFilter(), QCoreApplication::sendEvent(), QCoreApplication::postEvent(), QCoreApplication::processEvents().


【公共类型】(枚举)

enumType { None, ActionAdded, ActionChanged, ActionRemoved, ActivationChange, …, MaxUser }该枚举类型定义了Qt中的有效事件,共140个左右。

【属性】

该属性保存事件对象的接受标志。


【公有函数】

QEvent(QEvent::Type type)构造type类型的事件对象。
virtual~QEvent()析构。如果是 posted,它将从要发布的事件列表中删除。
voidaccept()

事件对象的 accept 标志。

virtual QEvent *clone() const创建并返回此事件的相同副本。
voidignore()

清除事件对象的 accept 标志,等效于调用  setAccepted(false)。

清除 accept 参数表示事件接收器不需要该事件。不需要的事件可能会传递到父控件。

boolisAccepted() const访问函数,查看accept 。
boolisInputEvent() const如果事件对象是QInputEvent或者它的一个子类则返回true
boolisPointerEvent() const如果事件对象是QSinglePointEvent则返回true
boolisSinglePointEvent() const如果事件对象是QSinglePointEvent则返回true
virtual voidsetAccepted(bool accepted)

设置事件对象的 accept 标志,等效于调用 setAccepted(true)。

设置 accept 参数表示事件接收器需要该事件。不需要的事件可能会传递到父控件。

boolspontaneous() const如果事件源自应用程序外部(系统事件),则返回真,否则返回假。
QEvent::Typetype() const返回事件类型。

【静态公有成员】

intregisterEventType(int hint = -1)

注册并返回自定义事件类型。如果 hint 提供的值可用,则使用它,否则它将返回一个 QEvent::User 和 QEvent::MaxUser 之间(1000-65535)尚未注册的值。如果 hint 的值不在 QEvent::User 和 QEvent::MaxUser之间,则忽略 。

如果所有可用值都被占用或程序正在关闭,则返回 -1。


<<<返回根页面

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值