首页 > 其他分享 >Qt 事件传递流程-事件处理器|事件分发器|事件过滤器

Qt 事件传递流程-事件处理器|事件分发器|事件过滤器

时间:2024-08-28 15:26:57浏览次数:13  
标签:控件 Qt 自定义 event 事件 过滤器 PropagateWidget lbl

(总体传递流程图见文章末尾)

自定义控件结构

 

自定义继承于QLabel的控件类 PropagateLabel.h

 

自定义窗口 PropagateWidget

 

PropagateWidget中添加一个PropagateLabel标签

 1 PropagateWidget::PropagateWidget(QWidget *parent) :
 2     QWidget(parent)
 3 {
 4     QVBoxLayout* verticalLayout=new QVBoxLayout(this);
 5     verticalLayout->setSpacing(0);
 6     verticalLayout->setContentsMargins(0,0,0,0);
 7 
 8     // 添加自定义标签PropagateLabel
 9     lbl=new PropagateLabel(this);
10 //    lbl->setText(QString::fromUtf8("Qt事件-总结"));
11     lbl->setFrameShape(QFrame::Box);
12     lbl->setFixedHeight(50);
13     lbl->setAlignment(Qt::AlignCenter);
14     lbl->setStyleSheet("background-color:blue;color:white;font-size:25px");
15 
16     verticalLayout->addWidget(lbl);
17 }

 

事件处理器-指定控件的指定事件

在自定义控件PropagateLabel中重写鼠标点击事件 mousePressEvent

1 void PropagateLabel::mousePressEvent(QMouseEvent *ev)
2 {
3     qDebug()<<"PropagateLabel::mousePressEvent";
4 }

 

鼠标点击控件,检测到事件输出相应信息

 

在窗口PropagateWidget中重写 mousePressEvent

1 void PropagateWidget::mousePressEvent(QMouseEvent *event)
2 {
3     qDebug()<<"PropagateWidget::mousePressEvent";
4 }

如果窗口检测到鼠标点击事件将会有相应输出

 

在自定义控件中设置事件接收状态为accept,则控件检测到事件之后不会传递给父控件(PropagateWidget),此时点击标签只有自定义控件的输出,即父控件检测不到事件

 

在自定义控件中设置事件接收状态为ignore,则控件检测到事件之后会传递给父控件(PropagateWidget),由输出可以看出,自定义控件先检测事件,然后传递给父控件,此时父控件能检测到事件

 

如果没有显式指定事件接收状态,则默认为accep,即省略ev->accept/ev->ignore,默认父控件检测不到事件

 

事件分发器-event

事件分发器在事件处理器之前获取事件

 

在自定义控件PropagateLabel中重写event

1 bool PropagateLabel::event(QEvent *e)
2 {
3     if (e->type()==QEvent::MouseButtonPress) // 指定需要检测的事件
4     {
5         qDebug()<<"PropagateLabel::event";
6     }
7     return QLabel::event(e); // 返回 把事件传递下去
8 }

 

由输出顺序可知,event先检测到事件,然后传递给默认事件处理器

 

如果在if分支中return true,则只有event能检测到事件

 

如果return false,则事件不会再被控件的默认事件处理器检测到,直接传递给父控件

 

事件过滤器-eventFilter

在事件到达控件之前拦截事件

 

在窗口PropagateWidget中重写事件过滤器

1 bool PropagateWidget::eventFilter(QObject *watched, QEvent *event)
2 {
3     if (watched==lbl && event->type()==QEvent::MouseButtonPress)
4     {
5         qDebug()<<"PropagateWidget::eventFilter";
6     }
7     return QWidget::eventFilter(watched,event);
8 }

 

在构造函数里为控件安装事件过滤器

lbl->installEventFilter(this);

 

输出顺序可以看到事件过滤器最早获取事件

 

最后一句 QWidget::eventFilter ,Qt里的定义为直接return false,即最后一句等价于直接写return false,事件会继续传递下去

在if分支里return true,则事件过滤器会拦截事件,不再传递下去

 

(总结)事件传递流程图

 

标签:控件,Qt,自定义,event,事件,过滤器,PropagateWidget,lbl
From: https://www.cnblogs.com/rabbit1103/p/18384759

相关文章

  • c#关于同步 /异常/多线程/事件 事例
    sync同步async异步,要与await成对使用Thread //计算程序执行时间StopWatch sw=StopWatch.Start();转自:https://codeload.github.com/zhaoxueliang86/WinFormsAsyncAwait/zip/refs/heads/BilibiliB站UP主:银色 usingSystem.Diagnostics;usingSystem.Text;na......
  • 解决方案 | QTTabBar工具栏命令按钮设置everything、filelocator在当前文件夹下面搜索
      备忘everything命令行参数参考-path(是everythin参数)表示在哪个位置(即哪个文件夹)下面搜索,这里%c%是qttabbar的参数,表示当前文件夹https://www.voidtools.com/zh-cn/support/everything/command_line_interface/     效果演示:  =====================f......
  • 【整理】 【Windows系列】Windows安全日志分析实战:关键事件+详解
    参考......
  • Qt/QML学习-Drawer
    QML学习Drawer例程视频讲解代码main.qmlimportQtQuick2.15importQtQuick.Window2.15importQtQuick.Controls2.15Window{width:640height:480visible:truetitle:qsTr("Drawer")Drawer{id:drawerwidth:pare......
  • 2024 windows系统下 Qt 加载 OCCT的方法
    一使用的版本OCCT使用了最新版,于2023.11.08发布的7.8.0。是用windowsvisualstudio编译后的软件包, 编号v143,就是VS2022所编译的。Download-OpenCASCADETechnologyhttps://dev.opencascade.org/release OCCT在qt运行时,所需的第三方依赖全部集中起来了,在github......
  • .net core下使用事件总线
    .netcore下使用事件总线        随着微服务的火热,DDD(领域驱动设计模式)思想风起云涌,冲击着整个软件生态系统。其中,事件总线那是必须知道的了,于是我便抱着一个学习DDD的心态搭建了一个博客网站,目前该网站正在建设阶段,后续会不断完善,这里我只是讲一下我里面所用到的......
  • 【C#】【Winform】自定义控件、自定义事件
    https://blog.csdn.net/m0_62366581/article/details/139553373在开发桌面的过程中,有时候自带的控件样式或者功能上可能不一定能够满足我们的所有要求。这时候,我们需要自定义控件。创建类库项目把图标拖放到资源文件中添加用户控件设置样式尺寸修改代码视图其他项目中复用......
  • QT/C++中的GDAL多线程应用(读取):发生的问题以及解决方案
    1.引言在使用GDAL库对TIF文件进行切割和创建瓦片金字塔时,为了提高创建效率,不得不考虑使用多线程处理。然而,在实际实现过程中,我遇到了许多问题。通过不断的尝试和优化,最终找到了有效的解决方案。本文将详细记录这一过程中的问题和解决方法。2.初始多线程尝试与问题2.1......
  • Vue2中的事件修饰符 用于处理DOM事件的触发方式
    一、.stop1.功能:阻止事件冒泡,即停止事件向上传播到父元素。2.代码演示:<div@click="parentClick"> <[email protected]="childClick">Clickme</button></div>二、.prevent1.功能:阻止默认行为,例如阻止表单提交或链接跳转。2.代码演示:<[email protected]="su......
  • 【PyQt5 应用程序】PyQt基础组件:按钮
    在任何图形用户界面(GUI)应用程序中,按钮是最基本也是最频繁使用的组件之一。它们是用户与应用程序交互的主要方式之一。在PyQt中,按钮可以通过QPushButton类创建,它提供了丰富的功能,包括显示文本、图像,以及响应点击事件。本节将引导你了解如何在PyQt应用中创建和使用按钮,并通过......