事件
事件(event)是由系统或者 Qt 本身在不同的时刻发出的。
一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。
Qt 程序需要在main()函数创建一个QApplication对象,然后调用它的exec()函数。这个函数就是开始 Qt 的事件循环。在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)
protected virtual 类 子函数实现
keyPressEvent()
keyReleaseEvent()
mouseDoubleClickEvent()
mouseMoveEvent() ----setMouseTracking()
mousePressEvent()
mouseReleaseEvent() 等。
event()函数主要用于事件的分发,分发给不同的事件处理器(event handler)。
e->type() == QEvent::KeyPress 事件类别
keyEvent->key() == Qt::Key_Tab 按键值
bool CustomTextEdit::event(QEvent*e)
{
if (e->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent =static_cast(e);
if (keyEvent->key() == Qt::Key_Tab)
{
qDebug() << "You presstab.";
return true;
}
}
return false;
}
事件过滤器
virtual bool QObject::eventFilter ( QObject *watched, QEvent * event );
现在我们可以总结一下 Qt 的事件处理,实际上是有五个层次:
1、重写paintEvent()、mousePressEvent()等事件处理函数。这是最普通、最简单的形式,同时功能也最简单。
1、重写event()函数。event()函数是所有对象的事件入口,QObject和QWidget中的实现,默认是把事件传递给特定的事件处理函数。
1、在特定对象上面安装事件过滤器。该过滤器仅过滤该对象接收到的事件。
1、在QCoreApplication::instance()上面安装事件过滤器。该过滤器将过滤所有对象的所有事件,因此和notify()函数一样强大,但是它更灵活,因为可以安装多个过滤器。全局的事件过滤器可以看到 disabled 组件上面发出的鼠标事件。全局过滤器有一个问题:只能用在主线程。
1、重写QCoreApplication::notify()函数。这是最强大的,和全局事件过滤器一样提供完全控制,并且不受线程的限制。但是全局范围内只能有一个被使用(因为QCoreApplication是单例的)。
class MyApplication : public QApplication
{
public:
MyApplication(int & argc, char ** argv):QApplication(argc, argv){};
virtual bool notify(QObject * obj, QEvent * event)
{
//qDebug()<<__PRETTY_FUNCTION__<<obj<<event;
if(event->type() == QMouseEvent::MouseButtonPress)
{
qDebug()<<__PRETTY_FUNCTION__<<obj<<event;
}
return QApplication::notify(obj,event);
}
};
网友评论