Qt----事件简述

目录

1,事件的概念

定义: 事件是应用程序内部发生的事情或应用程序需要知道的外部事件的结果。

事件和信号的区别:

事件是由外部向内部,信号是由内部向外部。事件先发生,信号后发生。

2,事件循环

javascript 复制代码
int  main()
{
    do_step1();
    do_step2();
}

等待事件发生之后再退出。

javascript 复制代码
int  main()
{
   while(!is_quit())
   {
       do_step1();
       do_step2();
   }  
}

当我们运行程序时,会向操作系统注册回调函数,当有事件发生时,操作系统会调用回调函数,此时会记录发生的事件是那种类型的事件,然后将事件加入到一个消息队列当中,此时一个循环就会处理消息队列中存储的事件,然后根据对应事件去进行逻辑处理。

3,父子控件之间事件的传递处理


以上两个图描述的是Qt负责处理事件处理的类关系图和Qt中常用的处理事件的几种方式。

在实际的项目中会经常处理父子窗口之间的事件传递,那么事件传递的机制是怎样的呢?

以下是两个事件处理函数。

其中Widget是父窗口,MyLineEdit是子窗口。当出现事件时,说先处理子窗口,后处理父窗口。

但是以上的编码实际上在多次出现某种事件之后父窗口的事件只执行了一次。所以需要在子窗口的事件函数中添加代码 event->ignore();
此外重写处理函数时,需要调用基类的处理函数。

有的时候根据需要我们需要事件进行子窗口到父窗口的传递,有时候不需要,那么怎么控制传递呢?
event->ignore(); 允许事件进行子窗口到父窗口的传递。
event->accept(); 阻止事件进行子窗口到父窗口的传递。

4,事件过滤器

通常情况下,一个父窗口中往往会有很多子窗口,而此时发生在这个窗口中的事件需要我们去一 一 处理,很多时候我们需要分清楚这个事件是发生在哪个子窗口中的,这个时候我们就需要事件过滤器去帮助我们判断。

假设我们的父窗口类为 Widget 子窗口类为 MyLineEdit 。

应用事件过滤器,首先要重写
bool QObject::eventFilter(QObject *watched, QEvent *event); 函数

其次还要给主窗口安装事件过滤器,
ui->lineEdit->installEventFilter(this); 在这个示例里面表示是一个名为lineEdit控件安装事件过滤器。

示例:

javascript 复制代码
bool  Widget::eventFilter(QObject *watched, QEvent *event)
{
   if(watched == ui->lineEdit)
   {
       if(event->type() == QEvent::KeyPress)
       {
           //进行相应逻辑处理
       }
   }
}
相关推荐
雾沉川几秒前
Visual C++运行库合集 v105.0 安装教程
开发语言·c++·dll
niucloud-admin1 小时前
NIUCLOUD LITE AI开发文档—模块开发:支付管理
开发语言
dear_bi_MyOnly2 小时前
栈和队列:从原理到应用全解析
c语言·开发语言·c++·学习·分类
Want5952 小时前
Python大雪纷飞①
开发语言·python·数学建模
代钦塔拉2 小时前
【C++/Qt 进阶】设计模式系列(4):原型模式——用“克隆“代替“重新构造“
c++·qt·设计模式
yujunl2 小时前
重写了一个BOM查询的脚本
开发语言
Python图像识别2 小时前
56-【2027毕设】YOLO11X光安检危险物品检测系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
事圆则缓2 小时前
Kotlin 集合与序列:给页面一份清楚的数据
开发语言·windows·kotlin
事圆则缓2 小时前
Kotlin 异步与并发:从一次搜索请求走到状态流
android·开发语言·kotlin
从小白到软工3 小时前
4-3 项目-学生成绩管理系统(上)
c语言·开发语言·数据结构·经验分享·ai编程