一、官方资料
1. 概述
在Qt中,事件都是从抽象类QEvent派生出来的对象。它们表示发生在应用程序内部或由于应用程序需要了解的外部活动而发生的事情。 事件可以由QObject子类的任何实例接收和处理,但它们与小部件尤其相关。 本文档介绍了在典型应用程序中如何传递和处理事件。
2. 事件如何传递
当事件发生时,Qt通过构造适当的QEvent子类的实例来创建一个事件对象来表示它,并通过调用事件函数将其传递到QObject的特定实例(或其子类之一)。
该函数不处理事件本身; 根据所传递事件的类型,它针对该特定事件类型调用事件处理程序,并根据事件被接受还是忽略发送响应。
一些事件,例如QMouseEvent和QKeyEvent ,来自窗口系统。 一些,例如QTimerEvent ,来自其他来源;有些来自应用程序本身,如自定义事件等。
3. 事件类型
大多数事件类型都有特殊的类,尤其是QResizeEvent , QPaintEvent , QMouseEvent , QKeyEvent和QCloseEvent 。 每个类都将QEvent子类化,并添加特定于事件的函数。 例如, QResizeEvent添加了size()和oldSize()来使小部件能够发现其尺寸如何更改。
4. 事件处理程序
传递事件的通常方法是调用虚拟函数。 例如,通过调用QWidget :: paintEvent ()来传递QPaintEvent 。 这个虚函数负责适当地做出反应,通常通过重新绘制窗口小部件。 如果您没有在虚拟函数的实现中执行所有必要的工作,则可能需要调用基类的实现。
5. 事件过滤器
6. 发送事件
7. 小结
Qt的主函数中会开启一个事件循环,其实就是一个处理事件的while循环。
return a.exec();
二、应用举例
1. 几种事件的使用
函数的声明:
代码语言:javascript复制protected: void changeEvent(QEvent *event); void showEvent(QShowEvent *event); void hideEvent(QHideEvent *event);
bool event(QEvent *event);
函数的实现:
代码语言:javascript复制void MyWidget::changeEvent(QEvent *event){ if (0 != event && QEvent::LanguageChange == event->type()) ui->retranslateUi(this); QWidget::changeEvent(event);}
void MyWidget::showEvent(QShowEvent *event){ Q_UNUSED(event); qDebug() << "<< showEvent" ;}
void MyWidget::hideEvent(QHideEvent *event){ Q_UNUSED(event); qDebug() << "<< hideEvent" ;}
bool MyWidget::event(QEvent *event){ if (event->type() == QEvent::KeyPress) { //无法捕获,被窗口焦点优先捕获 QKeyEvent *ke = static_cast<QKeyEvent *>(event); if (ke->key() == Qt::Key_Tab) { // special tab handling here qDebug() << "press the tab"; return true; }
if (ke->key() == Qt::Key_Delete) { qDebug() << "press the delete"; return true; } } //custom event handling// else if (event->type() == MyCustomEventType) {// MyCustomEvent *myEvent = static_cast<MyCustomEvent *>(event);// // custom event handling here// return true;// }
return QWidget::event(event);}
简单说说上面几个事件。
①changeEvent 在Qt动态切换语言时用到过
②showEvent、hideEvent 窗体的显示与隐藏。窗口最小化时调用hideEvent 事件,再次显示调用showEvent。
③event 所有产生的事件都会进入这里面,根据需要自行处理
本来想捕获Tab键来着,结果无法捕获,因为被窗口焦点优先捕获。
所以捕获了Delete键
④自定义事件的使用
效果:
由于结束了事件循环,a.exec()函数返回,Widget窗体函数超出作用域失效,窗体消失。