2016-12-16 1 views
1

Ich habe zwei Klassen:Erfahren Sie mehr über aufgetretenen Ereignisse aus anderen Klasse

typedef std::shared_ptr<AdaptedWidget> window_ptr; 

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

und

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

Ich brauche Informationen über Ereignisse zu erhalten, die von meinem WindowManager Objekt in AdaptedWidget Objekte passieren, wie kann ich TU das?

+1

man kann auf Ereignisse (abonnieren) hören oder ein anderes kann Ereignisse auftreten (veröffentlichen). –

+0

@hg_git bitte geben Sie mir ein Beispiel –

Antwort

1

Event filters sind die Qt Weg, um Ihre Aufgabe zu erfüllen.

Machen Sie Ihre WindowManager Klasse zu einer Unterklasse von QObject und stellen Sie eine Implementierung für ihre eventFilter() Methode zur Verfügung.

Danach jedes Mal, wenn Sie eine AdaptedWidget erstellen, verwenden Sie installEventFilter(), um Ihre WindowManager Instanz als Ereignisfilter darauf zu installieren.

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

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

und

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

und wann jede AdaptedWidget Instanz, die WindowManager als Ereignisfilter installieren:

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

Danke! getan wie du geschrieben hast! –

1

Die AdaptedWidget Klasse ein Signal haben sollte, die einen Maus-Druck anzeigt, z.B Ein anderer Ansatz besteht darin, Ereignisfilter zu verwenden, die die beiden Klassen jedoch unnötig eng miteinander koppeln.

Verwandte Themen