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";
}
}