一个事件由一个特定的QEvent子类表示,又包含多个事件类型(QEvent的枚举型QEvent::Type,用于表示事件而非处理事件)
事件处理方法
- 实现部件的paintEvent(),mousePressEvent()等特定的事件处理(常)
- 实现notify(),可在过滤器得到事件之前获得,一次只能处理一个事件
- 向QApplication对象安装过滤器,实现功能和第2种相同,可同时处理多个事件
- 实现event(),在事件到达默认的事件处理函数前获得该事件
- 在对象上安装过滤器,可在一个界面类中同时处理不同子部件的不同事件(常)
例:重写特定事件
void MyLineEdit::keyPressEvent(QKeyEvent * event)
{
//重写拥有事件处理的相应方法
//该方法为继承LineEdit的派生类的按下键盘事件
qDebug() << tr("键盘按下事件");
//重写该方法后,就不能输入字符,调用父类的事件输入字符
QLineEdit::keyPressEvent(event);
//如果忽略事件,则提交给父部件处理
//event->ignore();
}
例:实现event()
bool MyLineEdit::event(QEvent * event)
{
//先判断事件类型,再处理
if(event->type() == QEvent::KeyPress)
qDebug() << tr("event事件");
//返回父类的处理结果
return QLineEdit::event(event);
}
运行结果发现event先一步处理事件
例:过滤器
bool Widget::eventFilter(QObject * obj, QEvent * event)
{
//判断部件类型
if(obj == lineEdit)
//判断事件类型
if(event->type() == QEvent::KeyPress)
qDebug() << tr("过滤器");
//调用父方法
return QWidget::eventFilter(obj, event);
}
lineEdit->installEventFilter(this);
实现eventFilter方法后,可用installEventFilter方法安装到不同的部件上
因此过滤器的焦点在父部件上,发现过滤器先执行父再执行子
常用事件函数
- closeEvent():关闭部件事件
- showEvent():显示部件事件
- mouseMoveEvent():鼠标移动事件
- mousePressEvent():鼠标按下事件
- mouseReleaseEvent():鼠标松开事件
- mouseDoubleClickEvent():鼠标双击事件
- keyPressEvent():键盘按下事件
- keyReleaseEvent():键盘松开事件