Qt 事件与事件过滤
2010-03-11 11:03
120 查看
作者:丁冬,华清远见嵌入式学院讲师。
在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);
}
在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);
}
相关文章推荐
- QT5: 事件过滤.
- [Q学习]11 Qt事件系统——过滤事件
- Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)
- Qt事件与常用事件处理、过滤
- Qt 事件与事件过滤
- 自学QT之事件过滤
- QT事件过滤器(QT事件处理的5个层次:自己覆盖或过滤,父窗口过滤,Application过滤与通知)
- Qt的5个级别的事件处理和事件过滤方法
- Qt事件过滤
- Qt: 事件过滤
- 【QT】事件过滤
- Qt 事件与事件过滤
- 一起看代码来玩玩QT之06EventFilter (事件过滤)
- 在QT中通过键盘事件过滤,改变QTableWidget的键盘导航行为
- 自学QT之事件过滤
- 谈谈QtWebkit 键盘鼠标事件过滤
- Qt提供5个级别的事件处理和过滤
- <Qt+Linux>事件过滤
- qt 实现、区分鼠标单击,双击事件
- Qt中特殊Tab键事件的实现