QT事件事件之一: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";}
}
QT事件事件之一:Qt中的事件处理与传递相关推荐
- Qt 图形视图框架中的事件处理和传播
目录名字 Qt 图形视图框架中的事件处理和传播 要点: Qt 图形视图框架中的事件处理和传播 图形视图框架在一些动画类的应用程序上经常会用到.该框架中的事件处理与传播机制也是经常会涉及. 程序设计核心 ...
- QT的事件分发、事件过滤器详解
一.事件的流向 QT的各种控件(QObject的子类)都有事件处理成员函数,例如: bool QObject::event(QEvent *e);//所有事件 dragEnterEvent(QDrag ...
- QT消息/事件循环机制与多线程的关系
关于Qt子线程和消息循环 一.QT消息/事件循环机制 Qt作为一个可视化GUI界面操作系统,是基于事件驱动的,我们程序执行的顺序不再是线性,而是由一个个应用程序内部或外部的事件进行驱动,无事件时便阻塞 ...
- Qt自定义事件实现及子线程向主线程传送事件消息
近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就 ...
- Qt 自定义事件的实现
初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢?看了篇文章,说先要子类化QEvent,然后定义自己的QEvent::Type,然后重写QWidget::event ...
- Qt widget事件传递顺序以及监听特定控件是否接收某个事件
序言 其实刚开始接触的时候,是没注意到Qt widget中事件传递顺序,当时也才接触到Qt,也就没怎么去梳理,如今把我当前所掌握的先整理如下,后续如果有更深的理解,会不断完善这篇博客.(代码不是比较规 ...
- 【C/C++ Windows编程】Windows系统消息、Qt消息事件、linux下kill信号
Windows系统消息 文章目录 Windows系统消息 前言 一.什么是窗口? 二.什么是消息? 消息分类: windows消息机制架构图: 函数说明 消息结构体 GetMessage Transl ...
- VS+QT鼠标事件的一些补充
一:基础知识 1. 鼠标事件分为四种对应不同的函数(该四个函数均继承于QWidget): (1) 按下Press -> void mouseDoubleClickEvent ( QMouseEv ...
- 8.QT的事件循环与事件发送相关类
一.QT的事件发送类QCoreApplication QT使用QCoreApplication类为Qt程序提供了事件循环机制.该类继承QObject.QCoreApplication包含主事件循环,来 ...
最新文章
- Office 365系列(3)------Office 365认证使用ADFS安装部署参考
- 中断处理函数中自旋锁的应用
- 四十七、Ansible自动化入门
- QuickBI助你成为分析师-邮件定时推送
- 数字化经营支付3.0有哪些盈利机会
- Leetcode: Counting Bits
- OpenCV中的随机数
- Java基础入门笔记-构造方法的继承
- inputtextarea表单提示文字
- PE文件格式详解(下)
- 奔图3305_奔图Pantum P3305DN打印机驱动官方版
- java线程生命周期
- win7 OneNote不能登录一直登录
- 基于神经网络的人工智能,人工神经网络心得体会
- Intel汇编-部分余数
- linux 防火墙黑名单
- php读书笔记,读书笔记:《Modern PHP》
- sockaddr_in和sockaddr区别
- C语言学习开篇 对C语言和编程的认识
- HTML及CSS学习笔记 06 - CSS简介和常见的选择器
热门文章
- 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)- 续(附demo)
- 五、创建Bean的三种方式
- 3.0 C++远征:is a
- 玩转Win32开发(2):完整的开发流程
- 为何苦命干活的人成不了专家?
- Ajax_ASP.NET 添加 Ajax 和客户端功能_01
- visio生成数据表图
- 敲代码括号技巧_理解代码块概念,养成良好编程习惯 | 亲子课堂 第 3 课
- 四川省内二本计算机公立好的大学排名,四川有哪些二本院校是公立的?附四川省公立二本大学排名及分数线...
- 中职升高职c语言程序设计教程课后答案,中职C语言教学创新与实践论文