如何使QEvent冒泡到父QObjects?

时间:2016-01-18 12:13:33

标签: qt qevent

我需要制作一个GUI按钮,告诉它父母(或父母的父甚至父母的父母的 ...){{1}中的不同小部件应该显示。我创建了一个自定义QEvent:

QStackedLayout

我这样调用它:

class SwitchScreenEventWidget : public QEvent {
public:
  SwitchScreenEventWidget(QWidget* w) : SwitchScreenEvent(), widget(w) {
    if(widget==nullptr)
      throw "SwitchScreenEventWidget received null widget.";
  }
  virtual QWidget* getWidget() const {;return widget;}
private:
  QWidget* const widget;
};

并像这样处理:

// Through debugger I checked that this is getting called properly
void GraphButton::buttonClicked()
{
  if(qApp!=nullptr && parent()!=nullptr)
    qApp->notify(parent(), new SwitchScreenEventWidget(getGraph()));
}

我使用bool ViewStack::eventFilter(QEvent* e) { if(e->type()>=QEvent::User) { if(SwitchScreenEvent* event = dynamic_cast<SwitchScreenEvent*>(e)) { // Show the given widget } return true; } return false; } 然后注册到主app小部件。但事件并未被捕获。在某处,我读到了一些eventFilter,只是不会在层次结构中冒泡。

那么所有事件都会冒泡吗?如果不是,哪个,哪个没有,为什么?如何让我的活动泡泡正常?

1 个答案:

答案 0 :(得分:0)

我认为最好的方法是继承QApplication,覆盖notify方法并自行完成“泡泡事件”。我很确定鼠标和键盘事件会被这种方法“冒泡”而其他事件则没有。

  

bool QCoreApplication :: notify(QObject * receiver,QEvent * event)

     

向接收者发送事件:receiver-&gt;事件(事件)。返回值   从接收者的事件处理程序返回。请注意这一点   对于发送到任何线程中任何对象的所有事件,都会调用function。

     

对于某些类型的事件(例如鼠标和键事件),事件   将被传播到接收者的父母,依此类推   顶级对象,如果接收者对事件不感兴趣(即,   它返回false)。

所以你可以通过实现来改变这种行为。

还有关于你的代码示例。我想这个检查

if( qApp!=nullptr )

没用,因为你总是会有qApp的实例。