2016-12-16 53 views
1

我有兩個類:瞭解發生的事件從其他類

typedef std::shared_ptr<AdaptedWidget> window_ptr; 

class WindowManager 
{ 
public: 
... 
private: 
    std::stack<window_ptr> m_windowsStack; 
} 

class AdaptedWidget: public QWidget 
{ 
    Q_OBJECT 
public: 
    AdaptedWidget(AdaptedWidget *parent = 0); 
    bool event(QEvent *event); 
}; 

bool AdaptedWidget::event(QEvent *event) 
{ 
    if (event->type() == QEvent::NonClientAreaMouseButtonPress || 
     event->type() == QEvent::MouseButtonPress) 
    { 
     qDebug() << "mainwindwo press"; 
    } 
    return QWidget::event(event); 
} 

我需要得到有關AdaptedWidget對象發生從我WindowManager對象事件的信息,我怎麼能去做?

+1

一個可以聽事件(訂閱)或另一個可以告訴事件發生(發佈)。 –

+0

@hg_git請給我一些例子 –

回答

1

Event filters是Qt完成任務的方式。

使您的WindowManager類成爲QObject的子類,並提供其eventFilter()方法的實現。

之後,每次創建AdaptedWidget時使用installEventFilter()將您的WindowManager實例安裝爲事件過濾器。

class WindowManager : public QObject 
{ 
public: 
... 
bool eventFilter(QObject* obj, QEvent* ev); 

private: 
    std::stack<window_ptr> m_windowsStack; 
} 

bool WindowManager::eventFilter(QObject* obj, QEvent* ev){ 
    AdaptedWidget* widget= qobject_cast<AdaptedWidget*>(obj); 
    if(ev->type == /*type of event you are interested in*/){ 
     //you can compare widget against the stack of widgets you have 

     //if you want to stop widget from receiving the event you can return true 
    } 
    return false; 
} 

和創建每個AdaptedWidget實例時,安裝WindowManager作爲事件過濾器:

AdaptedWidget* widget= new AdaptedWidget; 
widget->installEventFilter(/*your WindowManager instance*/); 
+0

謝謝!按照你的寫法完成! –

1

AdaptedWidget類應具有指示按下鼠標的信號,例如

class AdaptedWidget : ... { 
    Q_OBJECT 
    ... 
public: 
    Q_SIGNAL void mousePress(const QPoint &); 
}; 

bool AdaptedWidget::event(QEvent *event) 
{ 
    if (event->type() == QEvent::NonClientAreaMouseButtonPress || 
     event->type() == QEvent::MouseButtonPress) 
    { 
     auto ev = static_cast<QMouseEvent*>(event); 
     emit mousePress(ev->pos()); 
     qDebug() << "mainwindow press"; 
    } 
    return QWidget::event(event); 
} 

另一種方法是使用事件過濾器,但不必要地緊密耦合這兩個類。