了解发生的事件从其他类

问题描述:

我有两个类:了解发生的事件从其他类

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请给我一些例子 –

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

谢谢!按照你的写法完成! –

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

另一种方法是使用事件过滤器,但不必要地紧密耦合这两个类。