簡體   English   中英

如何將QEvent傳遞給接收者擁有的對象?

[英]How can I pass a QEvent to an object owned by the receiver?

如何通過QObject :: event()函數將類接收到的事件傳遞給其數據成員之一,然后該數據成員將處理該事件?

例如,如果我有

class A
{
    B b;
    public:
        event(QEvent *);   
    //other members and functions
};

class B
{
    public:
        event(QEvent *);
    //other members
};

假設我從另一個函數發送事件,事件過濾器的對象A使用postEvent()從我的理解,該event()的函數A接收事件。 有沒有辦法將事件傳遞給AB的成員,然后由后者處理事件?

使用QCoreApplication::sendEvent

class B : public QObject
{
public:
  bool event(QEvent *);
};

class A : public QObject
{
  // Correct
  B b{this};
  // Wrong
  B bad;
public:
  bool event(QEvent * ev) override {
    if (ev->type() == my_event_type) {
      // Correct
      return QCoreApplication::sendEvent(&b, ev);
      // Wrong
      return b.event(&ev);
    }
    return QObject::event(ev);
  }
};

在C ++ 98中,如果沒有統一的初始化,則必須使用初始化列表:

class A : public QObject
{
  B b;
public:
  A(QObject * parent = 0) : QObject(this), b(this) {}
  bool event(QEvent * ev) { /*...*/ };
};

要避免的陷阱

  1. B的親子關系對於確保其與A處於同一線程中至關重要。 A用戶可以自由地將其移動到任何線程-這是QObject的約定(打破它是一個壞主意)。 當它們這樣做時,除非B在同一線程中,否則sendEvent會變成未定義的行為。 保證相關對象遵循線程的規范方法將其更改為將它們作為要跟蹤的對象的父對象。

  2. 不要直接調用QObject::event() :它只能由Qt調用。 直接調用它將繞過事件過濾器,並導致B行為不像QObject QObject合同的一部分是事件過濾器(各個級別)可以修改其功能。 直接調用event()會破壞B所有用戶的 LSP :他們將使用QObject ,但它的行為不再像QObject那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM