作者:丁冬,华清远见嵌入式学院讲师。
在Qt 当中事件都被看做为对象,都是继承与一个抽象的类QEvent,这样做的好处是为每一个可能存在的事件来分配一个侦听。当来自外界的事件出发,讲进行时间的处理,我们这个文档就是要讲如何使用事件。
事件是怎样驱动的
当一个事件发生的时候, Qt 将会创建一个对象来提供最接近QEvent 的子类来提供服务。 函数本身无法操控事件的本身, 而只能对于一个发来的时间做出相应, 有两种选项, 一种是接受一种是忽略。 一些事件例如QMouseEvent 或者QKeyEvent 是源于外部的事件, 而QTimerEvent 则是应用程序自己产生的事件。
事件类型
很多事件类型都有特自己特定的类, 例如 QResizeEvent, QPaintEvent, QMouseEvent, QKeyEvent, QCloseEvent , 他们都是QEvent 的子类, 并且添加了一些特定的功能, 例如QResizeEvent 添加了size() 与oldSize() 使得窗口在改变大小的时候可以做到保存。
一些类提供了特殊的类型, 例如QMouseEvent 提供的是鼠标的点击, 双击, 一动以及其他的一些相关的操作。
每一个Event 都包含了一些类型被定义在QEvent::Type 当中, 这样做的好处是更加方便的在程序运行时的检测类型, 并且在构造子类的同时可以直接作为对象来传递。
事件操控器
最常用的方法是调用虚拟函数, 例如当调用QPainteEvent 的时候她的驱动源泉是QWidget::paintEvent() . 这些虚拟函数提供给当前的不见做重新绘制的操作。
下面的例子是将所有的鼠标事件信息都与QCheckBox 进行关联,
void MyCheckBox::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
// handle left mouse button here
} else {
// pass on other buttons to base class
QCheckBox::mousePressEvent(event);
}
}
部件事件的关联都是从QEvent 基类来完成的, 用户可以使用QEvent来重写
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
return true;
}
} else if (event->type() == MyCustomEventType) {
MyCustomEvent *myEvent = static_cast<MyCustomEvent *>(event);
// custom event handling here
return true;
}
return QWidget::event(event);
}