• 11445阅读
  • 11回复

[提问]qt如何响应子控件的消息 [复制链接]

上一主题 下一主题
离线dingyi9982
 
只看楼主 倒序阅读 楼主  发表于: 2011-08-11
比如说在一个widget窗口中有一个treeWidget,我想要响应treeWidget的消息,比如contextMenuEvent,该怎么办?如果直接在widget那个类中重载这个函数的话响应的是widget的消息,而不是treeWidget的,我的一个方法是定义一个继承QTreeWidget的子类,但是这样感觉太麻烦了,有没有其他什么办法??
wonderful
离线wxj120bw

只看该作者 1楼 发表于: 2011-08-11
回 楼主(dingyi9982) 的帖子
考虑下InstallEventFilter函数
离线dingyi9982
只看该作者 2楼 发表于: 2011-08-16
安装事件监听的话在eventFilter()函数中应该无法捕获protected函数吧?它又不是一个消息,如果是的话如何判断??比如如果是按键消息,可以这样if(QEvent::KeyPress == event->type())就说明是按键消息,那这个如何判断呢??
wonderful
离线dbzhang800

只看该作者 3楼 发表于: 2011-08-16
离线dingyi9982
只看该作者 4楼 发表于: 2011-08-16
        ls的意思是用“用户自定义事件”吗??这样的话岂不是要在子控件所继承的protected函数中发送该事件,那还是要定义一个继承于该子控件的子类啊??不然根本无法重写该protected函数?
      不过我对“事件”的理解很少,也许理解错了。
wonderful
离线dbzhang800

只看该作者 5楼 发表于: 2011-08-16
引用第4楼dingyi9982于2011-08-16 09:11发表的  :
        ls的意思是用“用户自定义事件”吗??这样的话岂不是要在子控件所继承的protected函数中发送该事件,那还是要定义一个继承于该子控件的子类啊??不然根本无法重写该protected函数?
      不过我对“事件”的理解很少,也许理解错了。

这个?你前面不是抱怨不知道 如何过滤某些“事件”(就是你所谓的消息) 么?现在所有事件类型都给你了...
离线dingyi9982
只看该作者 6楼 发表于: 2011-08-16
但问题是那个子控件的protected函数没有哪个消息和它对应啊?
wonderful
离线dbzhang800

只看该作者 7楼 发表于: 2011-08-16
引用第6楼dingyi9982于2011-08-16 09:27发表的  :
但问题是那个子控件的protected函数没有哪个消息和它对应啊?

这个?是你没看前面给你的链接呢,还是不清楚事件过滤如何使用?亦或者你的对应有其他含义?

QEvent::ContextMenu   82   Context popup menu (QContextMenuEvent).
离线dingyi9982
只看该作者 8楼 发表于: 2011-08-16
谢了,明白了,不过contextMenuEvent只是我举的一个例子,有没有某些函数并没有对应的消息呢??
wonderful
离线dingyi9982
只看该作者 9楼 发表于: 2011-08-16
明白了,非常感谢!不过contextMenuEvent只是我举的一个例子,难道每一个虚函数都有对应的消息吗?
wonderful
离线dingyi9982
只看该作者 10楼 发表于: 2011-08-16
肿么发了两个一样的问题,我还以为第一次没发成功呢
wonderful
离线dbzhang800

只看该作者 11楼 发表于: 2011-08-16
引用第8楼dingyi9982于2011-08-16 10:47发表的  :
谢了,明白了,不过contextMenuEvent只是我举的一个例子,有没有某些函数并没有对应的消息呢??

注意我前面的用词
引用第5楼dbzhang800于2011-08-16 09:16发表的  :

这个?你前面不是抱怨不知道 如何过滤某些“事件”(就是你所谓的消息) 么?现在所有事件类型都给你了...



和虚函数没多少关系,负责事件处理的是 QObject::event() 以及各派生类的 ::event(),除此之外的所有 xxxx::***Event() 在一定程度上说,都是可以直接忽略的!!不妨看看以下代码片段,不解释

  1. bool QWidget::event(QEvent *event)
  2. {
  3.     switch (event->type()) {
  4.     case QEvent::MouseMove:
  5.         mouseMoveEvent((QMouseEvent*)event);
  6.         break;
  7.     case QEvent::MouseButtonPress:
  8.         mousePressEvent((QMouseEvent*)event);
  9.         break;
  10.     case QEvent::MouseButtonRelease:
  11.         mouseReleaseEvent((QMouseEvent*)event);
  12.         break;
  13.     case QEvent::MouseButtonDblClick:
  14.         mouseDoubleClickEvent((QMouseEvent*)event);
  15.         break;
  16. ...


快速回复
限100 字节
 
上一个 下一个