QT事件事件之一:Qt中的事件处理与传递

QT事件事件之一:Qt中的事件处理与传递


前言

在QT中,事件是我们很常用的东西,以下是我用事件时总结和做法


一、简介

在QT中,事件作为一个对象,继承QEvent类,常见的有键盘事件QKeyEvent、鼠标事件QMouseEvent和定时器事件QTimerEvent等,与QEvent类的继承关系如图所示。
在这里插入图片描述

二、QT中的事件

事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事件的通称。在QT中使用一个对象来表示一个事件,继承自QEvent类。事件与信号是不同的,他们的区别是
信号
1.信号不是事件,信号的本质是回调函数,在一个线程中可看作是同步操作
2.同时信号的发出者是对象,信号不会循环,接收者会立即收到
3.信号的返回值无意义
事件
1.事件一般是通过postEvent()函数进入到主循环队列中,是异步操作
2.事件的发出者一般是窗口系统,少数来自系统的内部
3.事件回调时是以当前窗口开始,一级一级向上派发,直到有一个窗口返回true,截断事件处理中心
4.事件根据返回值判断事件是否被处理
注意:

1、信号有具体的对象发出,然后马上交给connect()函数连接的槽进行处理,而对于事件,Qt使用一个队列事件对所有的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部。

2、信号一旦发出,槽函数一定会执行,事件可以用过滤器过滤.

3、信号与槽中,发送者所在的线程是无关紧要的。在自动连接情况下,Qt需要查看信号发出的线程是不是和信号接收者的线程一致,来决定连接的类型!

三、事件的实现的方法

代码如下(示例):

#ifndef MYLABEL_H
#define MYLABEL_H

#include <QWidget>
#include <QLabel>
#include <QDebug>
class mylabel : public QLabel
{
    Q_OBJECT
public:
    explicit mylabel(QWidget *parent = 0);
    //鼠标进入
    void enterEvent(QEvent *event);
    //鼠标离开
    void leaveEvent(QEvent *event);

signals:

public slots:
};

#endif // MYLABEL_H
#include "mylabel.h"

mylabel::mylabel(QWidget *parent) : QLabel(parent)
{

}

void mylabel::leaveEvent(QEvent *event)
{
    qDebug()<<"鼠标离开了";
}

void mylabel::enterEvent(QEvent *event)
{
    qDebug()<<"鼠标进入了";
}

这是我自定义的mylabel类来实现事件。此时我们只是实现了事件的功能,但是我们却没有对绑定相关的控件来实现这。第一种方法是我们在ui界面中,画一个label,然后将提升为mylabel自定义类。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二种方法,我们使用的是事件过滤器的形式来完成
代码如下(示例):

#ifndef MYLABEL_H
#define MYLABEL_H

#include <QWidget>
#include <QLabel>
#include <QDebug>
#include <QPushButton>
#include <QEvent>
class mylabel : public QLabel
{
    Q_OBJECT
public:
    QLabel * label1;
    QPushButton * btn_1;
    explicit mylabel(QWidget *parent = 0);
    //事件过滤器
    bool eventFilter(QObject *watched, QEvent *event);

signals:

public slots:
};

#endif // MYLABEL_H

代码如下(示例):

#include "mylabel.h"

mylabel::mylabel(QWidget *parent) : QLabel(parent)
{
    this->resize(300,500);
    this->setText("标签");
    btn_1=new QPushButton("登录",this);
    btn_1->installEventFilter(this);


}



bool mylabel::eventFilter(QObject *watched, QEvent *event)
{

    if(watched==btn_1 && event->type()==QEvent::MouseButtonPress)
    {

         qDebug()<<"找到btn_1";

    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenshida_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值