Qt事件
keyPressEvent()实现
void xxx::keyPressEvent(QKeyEvent *event)
{
switch(event->key()){
case Qt::Key_Home:
if(event->modifiers()&Qt::ControlModifier){
//处理,ctrl按键
}else{
//处理
}
break;
case Qt::Key_End:
break;
default:
QWidget::keyPressEvent(event);
}
}
安装事件过滤器
Qt事件模型一个非常强大的功能是:QObject实例在看到它的事件之前,可以通过设置另外一个QObject实例先监视这些事件。
创建一个事件过滤器包括如下两步过程:
1.通过对目标对象调用installEventFilter()来注册监视对象。
2.在监视对象的eventFilter()函数中处理目标对象的事件。
CustomerInfoDialog::CustomerInfoDialog(QWidget *parent):QDialog(parent)
{
firstNameEdit->installEventFilter(this);
lastNameEdit->installEventFilter(this);
cityEdit->installEventFilter(this);
phoneNumberEdit->installEventFilter(this);
}
这个事件过滤器一旦注册,发送给firstNameEdit、lastNameEdit、cityEdit和phoneNumberEdit窗口部件的事件就会在它们到达目的地之前先被发送给CustomerInfoDialog的eventFilter()函数。以下是接收这些事件的eventFilter()函数:
bool CustomerInfoDialog::eventFilter(QObjet *target,QEvent *event)
{
if(target == firstNameEdit || target==lastNameEdit || target==cityEdit
|| target==phoneNumberEdit){
if(event->type() == QEvent::KeyPress){
QKeyEvent *keyEvent == static_cast<QKeyEvent*>event;
if(keyEvent->key() == Qt::Key_Space){
focusNextChild();
return true;
}
}
}
return QDialog::eventFilter(target,event);
}
Qt提供了5个级别的事件处理和事件过滤方法。
1、重新实现特殊的事件处理器
重新实现像mousePressEvent() keyPressEvent() 和paintEvent(),这样的事件处理器是到目前为止最常用的事件处理方式。
2、重新实现QObject::event()
通过event()函数的重新实现,可以在这些事件到达特定的事件处理器之前处理它们。这种方式常用于覆盖Tab键的默认意义。当重新实现event()时,必须对那些没有明确处理的情况调用器基类的event()函数。
3、在QObject中安装事件过滤器
对象一旦使用installEventFilter()注册过,用于目标对象的所有事件都会首先发送给这个监视对象的eventFilter()函数。
4、在QApplication对象中安装事件过滤器
一旦在qApp(唯一的QApplication对象)中注册了事件过滤器,那么应用程序中每个对象的每个事件都会在发送到其它事件过滤器之前,先发送给这个eventFilter()函数。这种处理方式对于调试试非常有用的。
5、子类化QApplication并重新实现notify()
Qt调用QApplication::notify()来发送一个事件。重新实现这个函数实在事件过滤器得到所有事件之前获得它们的唯一方式。事件过滤器通常更有用,因为可以同时有多个事件过滤器,而notify()函数却只能有一个。
当调用QApplication::exec()时,就启动了Qt的事件循环。在开始的时候,Qt会发出一些事件命令来显示和绘制窗口部件。在这之后,事件循环就开始运行,它不断检查是否有事件发生并且把这些事件发送给应用程序中的QObject。