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);
     }
 }
posted @ 2022-03-05 18:27  看不见的R  阅读(128)  评论(0编辑  收藏  举报