QEvent(事件)

事件:是对各种应用程序需要知道的由应用程序内部或外部产生的事件或动作的统称。在Qt中任何一个QObject子类实例都可以接收和处理事件。

Qt中事件作为一个对象,继承自QEvent类,常见的有以下几种:

  • QKeyEvent       键盘事件
  • QMouseEvent  鼠标事件
  • QTimerEvent    定时器事件

QEvent常用的函数:

accept()设置事件对象的接受标志 ==setAccept(true)
ignore()

清除事件对象的接受标志参数 ==setAccept(false)

清除 accept 参数表示事件接收器不需要该事件。不需要的事件可能会传播到父小组件。

type()返回事件的类型

信号和事件的区别:

  •  事件由具体的QWidget(子)对象进行处理,信号由具体的QWidget(子)对象进行生成
  • 改写事件处理函数可能会导致程序行为发生变化,信号是否存在对应的槽函数不会改变程序的行为
  • 通常情况下,信号在具体的事件处理函数中

 事件的处理:

一个事件是由一个特定的QEvent子类来表示的,但一个事件又可以包含多个事件类型。

处理事件的方法:

  • 重新实现部件的paintEvent(),mousePressEvent()等事件处理函数(最常用)
  • 重新实现notify()函数(一次只能处理一个事件)
  • 在QApplication对象上安装事件过滤器(可以同时处理多个事件)
  • 重新实现event()函数
  • 在对象上安装事件过滤器,使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件

常用的方法为第一个和第五个。

事件的传递:

事件先传递给获得焦点的窗口部件,如果该部件忽略掉该事件,那么这个事件会传递给这个部件的父部件。重新实现事件处理函数时,一般要调用父类的相应事件处理函数来实现默认操作。

例子:

创建一个项目,继承于QWidget

添加一个c++文件,继承于QWidget

 修改mylineedit的继承关系,改为继承QLineEdit

在mylineedit.h中

 改为:

 mylineedit.cpp文件中

改为

这样的话就把继承关系修改为QLineEdit。

添加事件:

 在mylineedit.h添加一个按键按下的事件

void keyPressEvent(QEvent *event);//按键按下事件

在mylineedit.cpp中实现

void mylineEdit::keyPressEvent(QKeyEvent * event)//鼠标按下事件
{
    qDebug()<<"mylineedit的事件触发"
}

在widget中创建一个mylineedit对象

在widget.h中添加头文件、一个对象和键盘事件

#include<mylineedit.h>


mylineEdit *line;//一个对象
void keyPressEvent(QKeyEvent * event)//鼠标按下事件

widget.cpp的构造函数

    resize(800,800);
    line=new mylineEdit(this);
    line->move(100,100);

事件的实现: 

void Widget::keyPressEvent(QKeyEvent * event)//鼠标按下事件
{
    qDebug()<<"Widget的事件触发"
}

运行结果为

 当焦点在line中时按下回车,只会触发myline的事件,并不会传递。

 实现事件的传递:

修改mylineedit的事件

void mylineEdit::keyPressEvent(QKeyEvent * event)//鼠标按下事件
{
    qDebug()<<"myline的事件触发";
    QLineEdit::keyPressEvent(event);//执行QLineEdit的默认事件处理
    event->ignore();//忽略该事件
}
  • QLineEdit::keyPressEvent(event); //执行该市件原有的处理
  • event->ignore();//忽略该事件,忽略后可以传给父类事件

执行结果 :

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值