簡體   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