Qt事件
QEvent
所有的事件都是继承自这个类
在控件中重写 QEvent 事件的虚函数即可。
在Qt的运行机制中,事件是先于信号的,也就是说,如果过滤这个事件后,不会触发相应的信号与槽的函数。 要想继续触发,还需要在事件结尾添加一个标准的控件(重写信号的是自定义控件)的触发信号。例如这个例子后面的 QWidget::keyPressEvent(event);
;
#include <QKeyEvent>
// 重写这个虚函数
virtual void keyPressEvent(QKeyEvent *event);
void Widget::keyPressEvent(QKeyEvent *event)
{
// 这个是104键右下角的键
if(event->key() ==Qt::Key_Enter){
// ---> 如果按下enter 键则触发这个件
cout << "按下了enter键";
}
// 这个是键盘上的enter键
if(event->key() ==Qt::Key_Return){
// ---> 如果按下enter 键则触发这个件
cout << "按下了return键";
}
// ---> 继续回传标准事件,如果不写,则不会触发后面的信号
QWidget::keyPressEvent(event);
}
事件分发器
重写 event(QEvent *event)
可重新分发所有的事件。但是如果每个控件都要重写的话非常麻烦,可以直接使用事件过滤器,可以直接安装到具体的控件上,下面的示例就是安装到了 ui->tableView
控件上了。
事件过滤器
ui->tableView->installEventFilter(this);
bool Widget::eventFilter(QObject *obj, QEvent *event)
{
if (obj == ui->tableView) {
if (event->type() == QEvent::KeyPress) {
// ---> QEvent 事件转换成 keyEvent 事件
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
// ---> 显示按键的 ASCII 码
qDebug() << "Ate key press" << keyEvent->key();
// ---> 事件处理完成,不再传递事件。
return true;
} else {
// ---> 表示事件未处理完成,会继续传递事件。
return false;
}
} else {
// 如果不是 tableView 控件,则返回正常事件给父组件
return QWidget::eventFilter(obj, event);
}
}