Qt 如何使QEvent冒泡到父QObject?

Qt 如何使QEvent冒泡到父QObject?,qt,qevent,Qt,Qevent,我需要制作一个GUI按钮,告诉它的家长(或家长的家长,甚至家长的家长的家长…)应该显示QStackedLayout中的不同小部件。我创建了一个自定义QEvent: class SwitchScreenEventWidget : public QEvent { public: SwitchScreenEventWidget(QWidget* w) : SwitchScreenEvent(), widget(w) { if(widget==nullptr) throw "Sw

我需要制作一个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;
}
然后像这样处理:

// 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;
}
bool ViewStack::eventFilter(QEvent*e)
{
如果(e->type()>=QEvent::User){
if(SwitchScreenEvent*event=dynamic_cast(e)){
//显示给定的小部件
}
返回true;
}
返回false;
}
我使用
eventFilter
,然后将其注册到主应用程序小部件。但这一事件并没有被捕捉到。在某个地方,我读到了一些
QEvent
s,但它们并没有在层次结构中出现


那么,所有事件是否都存在泡沫?如果没有,哪些做,哪些不做,为什么?如何使我的事件正确冒泡?

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

boolqcoreapplication::notify(QObject*接收方,QEvent*事件)

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

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

所以你可以通过你的意识来改变这种行为

还有关于您的代码示例。我想这张支票

if( qApp!=nullptr )

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

尝试将事件的
接受标记设置为false。为什么不为此使用信号槽系统?您是否受到限制?@troyane我不想直接从
QPushButton
访问主小部件-我希望无论按钮有多少父节点,解决方案都能正常工作。您仍然可以使用signal,只需从最上面的窗口递归搜索您的
findChildren
,然后连接信号。@SebastianLange是的,这很聪明,我已经在做其他事情了,但我还是更喜欢事件方法,因为这些按钮可以在app init之后添加。