2016-12-16 10 views

답변

1

Event filters은 작업을 수행하는 Qt 방법입니다.

WindowManager 클래스를 QObject의 서브 클래스로 만들고 eventFilter() 메소드 구현을 제공하십시오.

그 다음에 AdaptedWidget을 만들 때마다 인스턴스를 이벤트 필터로 설치하려면 installEventFilter()을 사용하십시오.

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 클래스 마우스 프레스를 나타내는 신호를 가져야

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

고마워요! 당신이 쓴대로 끝났어! –

1

, 예

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

또 다른 접근법은 이벤트 필터를 사용하는 것인데, 불필요하게 긴밀하게 두 클래스를 연결합니다.