Qt中eventFilter事件出现莫名其妙的错误

tts_264 2014-08-08 10:41:58
#ifndef CESHI_H
#define CESHI_H

#include <QtGui/QMainWindow>
#include "ui_ceshi.h"

class ceshi : public QMainWindow
{
Q_OBJECT

public:
ceshi(QWidget *parent = 0, Qt::WFlags flags = 0);
~ceshi();

protected:
bool eventFilter(QObject *object, QEvent *e);
private:
Ui::ceshiClass ui;
};

#endif // CESHI_H


//cpp
#include "ceshi.h"

ceshi::ceshi(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
ui.label->installEventFilter(this);
}

ceshi::~ceshi()
{

}

bool ceshi::eventFilter(QObject *object, QEvent *e)
{
return true;
}

测试过程是这样的 我用设计师画了一个界面 上面放了一个QLabel 然后添加了一个图片 运行后神奇的发现图片不见了 惊讶了一下 然后将 ui.label->installEventFilter(this);这句注视掉 图片又出来了 或者注释调eventFilter这个函数 图片也会出现 很莫名其妙 实验了Qt两个版本 4.7.3 和Qt5.0.2 求大神解惑
...全文
1134 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tts_264 2014-08-09
  • 打赏
  • 举报
回复
return flase 问题就解决了 感谢
ybjx111 2014-08-09
  • 打赏
  • 举报
回复
都说了不要return true 你都不知道这个函数是干嘛的还用
tts_264 2014-08-08
  • 打赏
  • 举报
回复
引用 9 楼 u014019207 的回复:
[quote=引用 8 楼 u014019207 的回复:] [quote=引用 7 楼 ybjx111 的回复:] [quote=引用 5 楼 u014019207 的回复:] [quote=引用 2 楼 ybjx111 的回复:] 返回true表示接收消息的控件不处理该消息, 你把全部的消息都返回true来过滤掉,自然就不会绘制图片了 在eventFilter中不要直接返回true,否则控件将接收不到任何消息。
我在设计师里面已经添加了一张图片了啊 QLabel里面 就是调用这个的时候 既然图片消失了 才会很吃惊的[/quote] 都是了eventFilter不要直接return true,这样控件讲不会接收到任何消息,自然就不会绘制图片了,你添加的图片就看不到了。[/quote] 大哥 能不能看清楚问题啊。。。 是我本来已经到设计师里面添加一张图片了 这样弄以后 图片既然消失了 我现在是不想eventFitle帮我做任何事情啊 我只是想你们分析下 为什么图片消失了 而不是让他重新帮我绘制一张图片[/quote] bool CMainStartUI::eventFilter(QObject *obj, QEvent *eve) { if (obj == ui.label) { if (eve->type() == QEvent::Enter) setLabelIcon(ui.label,"images/images/on-1.png"); } return true; } void CMainStartUI::setLabelIcon(QLabel *label,const QString &path) { QPixmap pixmap(path); label->setPixmap(pixmap); } 即使这样 图片一样是消失的状态 很莫名其妙 [/quote] 而且我图片路径肯定传对了 如果去掉注册那一行代码 图片是显示的
tts_264 2014-08-08
  • 打赏
  • 举报
回复
引用 8 楼 u014019207 的回复:
[quote=引用 7 楼 ybjx111 的回复:] [quote=引用 5 楼 u014019207 的回复:] [quote=引用 2 楼 ybjx111 的回复:] 返回true表示接收消息的控件不处理该消息, 你把全部的消息都返回true来过滤掉,自然就不会绘制图片了 在eventFilter中不要直接返回true,否则控件将接收不到任何消息。
我在设计师里面已经添加了一张图片了啊 QLabel里面 就是调用这个的时候 既然图片消失了 才会很吃惊的[/quote] 都是了eventFilter不要直接return true,这样控件讲不会接收到任何消息,自然就不会绘制图片了,你添加的图片就看不到了。[/quote] 大哥 能不能看清楚问题啊。。。 是我本来已经到设计师里面添加一张图片了 这样弄以后 图片既然消失了 我现在是不想eventFitle帮我做任何事情啊 我只是想你们分析下 为什么图片消失了 而不是让他重新帮我绘制一张图片[/quote] bool CMainStartUI::eventFilter(QObject *obj, QEvent *eve) { if (obj == ui.label) { if (eve->type() == QEvent::Enter) setLabelIcon(ui.label,"images/images/on-1.png"); } return true; } void CMainStartUI::setLabelIcon(QLabel *label,const QString &path) { QPixmap pixmap(path); label->setPixmap(pixmap); } 即使这样 图片一样是消失的状态 很莫名其妙
tts_264 2014-08-08
  • 打赏
  • 举报
回复
引用 7 楼 ybjx111 的回复:
[quote=引用 5 楼 u014019207 的回复:] [quote=引用 2 楼 ybjx111 的回复:] 返回true表示接收消息的控件不处理该消息, 你把全部的消息都返回true来过滤掉,自然就不会绘制图片了 在eventFilter中不要直接返回true,否则控件将接收不到任何消息。
我在设计师里面已经添加了一张图片了啊 QLabel里面 就是调用这个的时候 既然图片消失了 才会很吃惊的[/quote] 都是了eventFilter不要直接return true,这样控件讲不会接收到任何消息,自然就不会绘制图片了,你添加的图片就看不到了。[/quote] 大哥 能不能看清楚问题啊。。。 是我本来已经到设计师里面添加一张图片了 这样弄以后 图片既然消失了 我现在是不想eventFitle帮我做任何事情啊 我只是想你们分析下 为什么图片消失了 而不是让他重新帮我绘制一张图片
ybjx111 2014-08-08
  • 打赏
  • 举报
回复
返回true表示接收消息的控件不处理该消息, 你把全部的消息都返回true来过滤掉,自然就不会绘制图片了 在eventFilter中不要直接返回true,否则控件将接收不到任何消息。
ybjx111 2014-08-08
  • 打赏
  • 举报
回复
eventFilter里面干了什么? 会不会是这个函数在处理某些消息(如paintevent)时返回了true?
ybjx111 2014-08-08
  • 打赏
  • 举报
回复
引用 5 楼 u014019207 的回复:
[quote=引用 2 楼 ybjx111 的回复:] 返回true表示接收消息的控件不处理该消息, 你把全部的消息都返回true来过滤掉,自然就不会绘制图片了 在eventFilter中不要直接返回true,否则控件将接收不到任何消息。
我在设计师里面已经添加了一张图片了啊 QLabel里面 就是调用这个的时候 既然图片消失了 才会很吃惊的[/quote] 都是了eventFilter不要直接return true,这样控件讲不会接收到任何消息,自然就不会绘制图片了,你添加的图片就看不到了。
tts_264 2014-08-08
  • 打赏
  • 举报
回复
引用 3 楼 lovesmiles 的回复:
bool ceshi::eventFilter(QObject *object, QEvent *e) { return true; } 如果没有猜错,应该在里面加上父类的eventFilter调用
可以加啊 我开始以为是我调用到其他的事件把图片给弄掉了 所以才把这个函数什么都不做 图片既然也消失了 没想明白 能帮忙试试吗
tts_264 2014-08-08
  • 打赏
  • 举报
回复
引用 2 楼 ybjx111 的回复:
返回true表示接收消息的控件不处理该消息, 你把全部的消息都返回true来过滤掉,自然就不会绘制图片了 在eventFilter中不要直接返回true,否则控件将接收不到任何消息。
我在设计师里面已经添加了一张图片了啊 QLabel里面 就是调用这个的时候 既然图片消失了 才会很吃惊的
tts_264 2014-08-08
  • 打赏
  • 举报
回复
引用 1 楼 ybjx111 的回复:
eventFilter里面干了什么? 会不会是这个函数在处理某些消息(如paintevent)时返回了true?
我就是什么都不干 我想知道为什么图片会消失 我这里主要是为了切换移动上去的图片 还有按下的 意思就是 为什么这样 图片会消失 就这么点代码 没有其他的事件了
勤奋的小游侠 2014-08-08
  • 打赏
  • 举报
回复
bool ceshi::eventFilter(QObject *object, QEvent *e) { return true; } 如果没有猜错,应该在里面加上父类的eventFilter调用
资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 在 Qt 框架EventFilter 是一个非常强大的功能,它允许我们对特定的对象进行深度监听,从而在这些对象接收到事件时执行自定义的操作。本示例主要展示了如何为鼠标点击事件和键盘输入事件安装过滤器,并将相关的信息输出到状态栏,这不仅可以帮助开发者进行调试,还能用于实现一些特殊的功能。 EventFilterQt 是一个类,通过重写 QObject::eventFilter() 方法可以实现对事件的拦截和处理。当一个对象被设置为另一个对象的事件过滤器时,它会优先于被过滤对象接收事件。如果事件过滤器对事件进行了处理,那么被过滤对象就不会再接收到该事件。为了实现这一功能,我们需要创建一个继承自 QObject 的类,并重写其 eventFilter() 方法。在该方法,我们可以通过检查事件类型来判断是否是鼠标点击事件(QEvent::MouseButtonPress、QEvent::MouseButtonRelease)或键盘输入事件(QEvent::KeyPress、QEvent::KeyRelease),并根据需要进行相应的处理。例如: 接下来,我们需要将这个事件过滤器安装到感兴趣的对象上,通常是窗口或控件。例如,如果要监听一个 QWidget 类型的对象 myWidget,可以通过以下代码实现: 为了将事件信息输出到状态栏,我们需要获取应用程序的状态栏对象,并在 eventFilter() 方法调用其 showMessage() 方法。以下是具体的实现示例: 通过上述代码,我们能够捕捉到用户的鼠标点击位置和键盘按键,并将这些信息实时显示在状态栏上,这在调试或记录用户交互时非常有帮助。在 EventFilter 压缩包,可能包含了一些源代码文件(如 .cpp 和 .h

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧