重载QCoreApplication::notify()后该怎么用?

MichealTX 2011-10-12 07:18:41
我看Qt手册上说重写QCoreApplication::notify()后可以获得事件处理的完全控制权
Reimplementing this function. This is very powerful, providing complete control; but only one subclass can be active at a time.

于是我把QCoreApplication子类化为MySender后,重写了notify函数,代码如下:

class MySender: public QCoreApplication
{
public:
MySender(int argc,char *argv[]):QCoreApplication(argc,argv){}

public:
bool notify(QObject *receiver, QEvent *event);

};

bool MySender::notify(QObject *receiver, QEvent *event)
{
if(event->type() == MyEventType)
{
qDebug()<<"MyEventType is coming!";
return true;
}
return QCoreApplication::notify(receiver,event);
}



然后我在main()函数中这样应用:


int main(int argc, char *argv[])
{
//QCoreApplication a(argc, argv);
MySender mySender(argc,argv);

MyArmy myArmy;
MyWatcher myWatcher;
myArmy.installEventFilter(&myWatcher);//安装事件过滤器

MyEvent myEvent(MyEventType);
mySender.sendEvent(&myArmy,&myEvent);

return mySender.exec();
}

只输出了重载后的notify()里的那句MyEventType is coming!

然后就什么也没有了,控制台就在那里空等着。

它怎么没有继续向下处理sendEvent中的那个事件myEvent呢?接收者myArmy还要响应这个myEvent进行响应的输出呢。

要是放弃重载notify,用QCoreApplication 声明的a,把mySender有关的注释掉,代码改成下面这样:


int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//MySender mySender(argc,argv);

MyArmy myArmy;
MyWatcher myWatcher;
myArmy.installEventFilter(&myWatcher);//安装事件过滤器

MyEvent myEvent(MyEventType);
//mySender.sendEvent(&myArmy,&myEvent);

a.sendEvent(&myArmy,&myEvent);

return a.exec();
}
这样就行了,myArmy接收并响应了myEvent,输出正常。

可是我想重载那个notify,到底该怎么做?请大家不吝赐教!
...全文
577 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
MichealTX 2011-10-12
  • 打赏
  • 举报
回复

注释掉notify中的那个return true就好了!

只在最后return QCoreApplication::notify就行了,这个原装notify会继续myEvent的传递。我对notify了解不深,不知道它内部怎么回事,在这搞错了。重写notify就是在事件被向下传递之前截住它,随便搞它,搞完了还得给QCoreApplication::notify,否则直接返回的话myArmy收不到这个事件。

O(∩_∩)O~谢谢你了!orz orz orz

[Quote=引用 4 楼 dbzhang800 的回复:]

哦,我知道了,你想让事件继续被派发。那就把你的 return 去掉
[/Quote]
dbzhang800 2011-10-12
  • 打赏
  • 举报
回复
哦,我知道了,你想让事件继续被派发。那就把你的 return 去掉
dbzhang800 2011-10-12
  • 打赏
  • 举报
回复
看不懂你的问题

首先 sendEvent 和事件循环(那个exec()) 没有关系

其次 你的notify都看到事件了,不已经说明你的 sendEvent 已经执行了么?

题外:
你最终目的是什么呢?
MichealTX 2011-10-12
  • 打赏
  • 举报
回复
嗯嗯,见笑了,O(∩_∩)O~,重载的函数名必须相同参数必须不同。

是呀,我就是那么做的,可不知道为什么会出错,难道用mySender.exec()进入事件循环后不再管sendEvent的事件了么?
[Quote=引用 1 楼 dbzhang800 的回复:]

引用楼主 michealtx 的回复:
可是我想重载那个notify,到底该怎么做?请大家不吝赐教!

呵呵,首先纠正一下,这不叫重载(overload),叫 override

再就是,
你不是已经已经 orerride 了,也已经"截获"事件了么?而且选择了不做任何处理直接返回(return)
[/Quote]
dbzhang800 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 michealtx 的回复:]
可是我想重载那个notify,到底该怎么做?请大家不吝赐教!
[/Quote]
呵呵,首先纠正一下,这不叫重载(overload),叫 override

再就是,
你不是已经已经 orerride 了,也已经"截获"事件了么?而且选择了不做任何处理直接返回(return)

16,173

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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