概述
文章目录
- 1. 重新实现特殊的事件处理器
- 2. 重新实现QObject::Event
- 3. 安装事件过滤器
- 4. 在QApplication对象中安装事件过滤器
- 5.子类化QApplication,并且重新实现notify()函数
1. 重新实现特殊的事件处理器
继承Qt作为基类, 重新实现(override
)像mousePressEvent()
,keyPressEvent()
这样特定的事件处理器。这是一种最为常见的方式。
2. 重新实现QObject::Event
重新实现event()
函数,可以在事件到达特定的事件处理器之前处理他们。这种方式通常用于处理那些不常见的、没有默认事件处理器的事件,比如: QEvent::HoverEnter
。重新实现event()
函数后,必须对没有处理的情况调用明确调用其基类的event()
函数。
3. 安装事件过滤器
目标对象使用installEventHandler()
函数注册过之后,所有用于目标对象的事件都会首先发送给监视对象的eventFilter()
函数中。如果一个目标对象安装了多个事件过滤器,则会根据安装顺序,逆序激活事件过滤器。
安装事件处理器的步骤为两步:
- 对目标对象调用
installEventHandler()
函数来注册监视对象 - 在监视对象的
eventFileter()
函数中处理目标对象的事件。
bool FilterObject::eventFilter(QObject *object, QEvent *event)
{
if(event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->key() == Qt::Key_Tab)
{
// 处理Tab键
return true;
}
}
return BaseObject::eventFilter(object, event);
}
返回为true
,表示告诉Qt已经处理了这个事件,返回为false
,Qt会继续把这个事件传递给目标对象。
4. 在QApplication对象中安装事件过滤器
一旦在qApp
对象中注册了事件过滤器,则应用程序的所有对象的所有事件都会在发送到其他事件过滤器之前,先发送给监视对象的eventFilter()
函数。这种方式通常用于调试中,但这种方式势必对程序的运行效率造成影响。(在QApplication::notify()
中, 是先调用qApp
的过滤器, 再对事件进行分析, 以决定是否合并或丢弃)
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
MainWindow mainwindow;
a.installEventFilter(&mainwindow); //为 QApplication 注册过滤器
mainwindow.setWindowTitle(QObject::tr("在QApplication对象中安装事件过滤器"));
mainwindow.resize(400, 200);
mainwindow.show();
return a.exec();
}
5.子类化QApplication,并且重新实现notify()函数
重新实现这个函数是在事件过滤器得到所有事件之前获取它们的唯一方式。通常事件过滤器更有用,因为可以同时有多个事件过滤器,而notify()
函数只有一个。
如果事件在到达它的目标对象之前没有得到处理,或者也没有被它自己的目标对象处理,那么就会重复整个事件处理过程。但是这一次会把目标对象的父对象作为新的目标对象。这样一直传递下去,直到事件完全得到处理,或者是到达了最顶层的对象为止。
ps: 在嵌入式系统中,notify()
函数还可以用来监视用户点击动作,在一定时间内没有动作则执行休眠、关机等操作。
屏蔽 MouseButtonPress、MouseButtonRelease 和 MouseMove 事件
#include "myapplication.h"
#include <QMouseEvent>
bool MyApplication::notify(QObject *receiver, QEvent *e)
{
//屏蔽 MouseButtonPress、MouseButtonRelease 和 MouseMove 事件
if (e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseButtonRelease || e->type() == QEvent::MouseMove)
{
return true;
}
return QApplication::notify(receiver, e);
}
参考链接:https://www.cnblogs.com/wenhao-Web/p/12292340.html
最后
以上就是勤奋大山为你收集整理的Qt的5种事件处理方式的全部内容,希望文章能够帮你解决Qt的5种事件处理方式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复