Qt事件系统与应用举例
今天是五一劳动节的第四天——五四青年节!
注:中国国家统计局,青年的年龄是15-34岁。
实事:B站推出宣传视频短片——《后浪》
金融:央行报告城镇居民家庭净资产均值为289.0万元,中位数 141
万元。
一、 官方资料
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. 几种事件的使用
函数的声明:
protected: void changeEvent(QEvent *event); void showEvent(QShowEvent *event); void hideEvent(QHideEvent *event);
bool event(QEvent *event);
函数的实现:
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(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(event); // // custom event handling here // return true; // }
return QWidget::event(event); }
简单说说上面几个事件。
① changeEvent
在 Qt
动态切换语言时用到过
② showEvent
、 hideEvent
窗体的显示与隐藏。窗口最小化时调用 hideEvent
事件,再次显示调用 showEvent
。
③ event
所有产生的事件都会进入这里面,根据需要自行处理
本来想捕获Tab键来着,结果无法捕获,因为被窗口焦点优先捕获。
所以捕获了Delete键
④自定义事件的使用
效果:
由于结束了事件循环,a.exec()函数返回, Widget
窗体函数超出作用域失效,窗体消失。
三、小结
大家五四青年节快乐!!!
欢迎关注公众号: