您的位置:首页 > 编程语言 > Qt开发

Qt 事件与事件过滤

2011-08-04 14:30 148 查看
作者:丁冬,华清远见嵌入式学院讲师。
在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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: