繁体   English   中英

如何使一个QEvent冒泡到父QObjects?

[英]How to make a QEvent that bubbles up to parent QObjects?

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

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;
}

我使用eventFilter ,然后将其注册到主应用程序小部件。 但是事件没有被捕获。 我在某个地方读过一些QEvent只是根本不了解层次结构。

那么所有事件是否都会冒泡? 如果不是,哪个做,哪个不做,为什么? 以及如何使活动泡沫正确?

我认为对您来说最好的方法是将QApplication子类化,重写notify方法并自己执行“冒泡事件”。 我很确定鼠标和键盘事件会通过这种方法“冒泡”,而其他事件不会。

布尔QCoreApplication :: notify(QObject *接收器,QEvent *事件)

发送事件到接收者:接收者->事件(事件)。 返回从接收者的事件处理程序返回的值。 请注意,对于发送到任何线程中任何对象的所有事件,将调用此函数。

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

因此,您可以通过实现更改此行为。

另外关于您的代码示例。 我认为这张支票

if( qApp!=nullptr )

是无用的,因为您总是会有qApp的实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM