当前位置: 首页 > 知识库问答 >
问题:

qt - (Qt)为什么我的这个eventFilter拦截不到到它的子控件的event?

华项明
2024-04-05

父控件内的关键代码

Widget::Widget(QWidget *parent)    : QWidget(parent)    , ui(new Ui::Widget),m(new MyLabel(this)){    ui->setupUi(this);    m->installEventFilter(this);}bool Widget::eventFilter(QObject *obj, QEvent *ev){    cout<<ev->type()<<endl;    return QWidget::eventFilter(obj,ev);}

子控件内的关键代码

void MyLabel::mousePressEvent(QMouseEvent *ev){    cout<<"label mouse press event"<<endl;    ev->ignore();}

这个MyLabel就是简单地继承了QLabel并重写了这个mousePressEvent.
运行的结果是,我点击MyLabel时,会打印这个"label mouse press event",说明事件确实发生,并交到了MyLabel对象手上.
但这个过程中,被安装到其上的过滤器eventFilter完全没反应,这是怎么回事?

共有1个答案

黄浩涆
2024-04-05

在Qt中,eventFilter 方法在事件分发过程中被调用,允许你在事件到达目标对象之前进行拦截和处理。然而,有些类型的事件可能不会通过标准的事件分发机制传递,特别是当事件被目标对象自身直接处理时。

在你的例子中,MyLabel 类的 mousePressEvent 被重写,这意味着当鼠标按下事件发生时,这个事件会被 MyLabel 直接处理,而不是通过标准的事件分发机制传递给其父控件或其他已安装的事件过滤器。

由于 mousePressEvent 直接在 MyLabel 内部被调用,它绕过了事件分发系统,因此父控件中的 eventFilter 方法不会被调用。

要解决这个问题,你有几个选择:

  1. 重写事件分发:在 MyLabel 中重写事件分发方法(如 event),并在其中调用父类的相应方法,以确保事件继续向上传递。
  2. 使用不同的方法:如果你想要在父控件中处理子控件的事件,考虑使用信号和槽机制而不是事件过滤器。例如,你可以从 MyLabel 发出一个自定义信号,当鼠标按下事件发生时,然后在父控件中连接这个信号到适当的槽。
  3. 调整事件过滤器策略:如果你的目标是处理所有类型的事件,你可能需要在不同的层次和控件上安装多个事件过滤器。

记住,事件过滤器通常用于拦截那些通过标准事件分发机制传递的事件。如果事件直接在目标对象内部被处理,事件过滤器则不会起作用。

 类似资料:
  • 前面说了这么多 Qt 的介绍,相信一定有很多朋友还是要问,那么我们为什么要选择 Qt 做开发呢,它到底有哪些突出的优势呢,下面就是笔者给出的答案。 Qt 是基于 C++ 的一种语言扩展(Extention) C/C++ 目前还是一种很多人都在学习的语言. Qt 的好处就在于 Qt 本身可以被称作是一 种 C++ 的延伸。Qt 的类都是用 C++ 写出来的。这也就是说, Qt 本身已经继承了 C++

  • 导语 上一节已经安装好Qt 5.2,并将一个Qt 4程序迁移到了Qt 5上。其中我们讲到Qt 5中QApplication类已经不在QtGui模块中了,而且所有的Qt 5图形界面程序都必须在.pro项目文件中添加widgets模块。那么到底Qt 5中对模块进行了哪些改动,Qt 5的框架又是怎样的?这一节将和大家一起看一下这些内容。 环境:Windows 7 + Qt 5.2.0+QtCreator

  • 为什么我的这个netfilter的钩子函数抓不到端口号? 钩子函数是这个,然后我用insmod把它加入内核,但端口号显示的并不是正确的.我开了几个网页,但它并没有出现类似80,443的端口号.我又开了2个终端,用netcat在本地的12345端口进行了几次通信,它还是没有显示12345?

  • 问题内容: 我正在尝试打开一个保存在源文件夹本身中的CSV文件名“ logger.csv”。 但是,这一直在给我一个“找不到文件”错误。 问题答案: 如果您现在就使用相对路径,则该文件需要存在于项目根目录中, 而不是 存在于java文件的目录中。 考虑以下层次结构: 不管用。 将 现在 的工作。(注意,该文件与src目录相邻。)

  • 问题内容: 我在asp.net项目的Content文件夹中有一个json文件: …以及访问它的代码: …但是调用代码时什么也没发生;浏览器控制台说:“无法加载资源:服务器响应状态为404(未找到)” 为什么找不到?“波浪号文件名”不是通往文件的正确路径吗? 更新 我还尝试了向后“重击”: …并且得到相同的结果(“ 无法加载资源:服务器以404(未找到)状态进行响应 ”) 更新2 然后,我尝试了这种

  • 问题内容: 因此,当我在Qt Creator中创建一个新的Qt项目时,只要求提供一些简单的详细信息,例如项目的位置,构建目标,主窗口类名称(以及标题,源文件和表单文件)以及最终选择将其添加到版本控制中。 创建项目后,仅获得qt核心和gui模块。我的问题是如何添加其他模块(例如network或opengl)。我已经看过了,但是我找不到如何轻松添加其他Qt模块的任何内容。我知道我可以编辑.pro文件,