2013-02-14 9 views
5

Ich habe eine QStackedWidge t innerhalb einer QDockWidget - je nachdem, welche Seite angezeigt wird, ich möchte die Schließen-Schaltfläche auf dem QDockWidget zeigen/verbergen. Ich kann dies tun, indem Sie QDockWidget::setFeatures() verwenden.So erfassen Sie das QDockWidget Schließen Sie die Schaltfläche click event

Aber das Problem, das mir gegenübersteht, ist, wie man das Signal der Schließen-Schaltfläche erfasst, so dass ich die Dock-Funktionen ändern/den gestapelten Widget-Seitenindex einstellen kann.

QDockWidget close button

Ich habe versucht, einen Ereignisfilter zu verwenden:

class EventFilter : public QObject 
{ 
    Q_OBJECT 
public: 
    EventFilter(QObject* aParent); 
protected: 
    bool eventFilter(QObject *obj, QEvent *event); 
}; 

EventFilter::EventFilter(QObject* aParent) 
    : QObject(aParent) 
{ 

} 

bool EventFilter::eventFilter(QObject *obj, QEvent *event) 
{ 
    if (event->type() == QEvent::Close) 
    { 
     return true; 
    } 
    return QObject::eventFilter(obj, event); 
} 

und installiert es als so:

EventFilter* filter = new EventFilter(this); 
u->dockWidget_6->installEventFilter(filter); 

Im Konstruktor meines QMainWindow - die eventFilter() Methode nicht tat gerufen werden.

Also die nächst ich versuchte, das QDockWidget::visibilityChanged geänderte Signal zu verwenden, da es so klang sein könnte, was ich wollte:

connect(u->dockWidget_6, SIGNAL(visibilityChanged(bool)), SLOT(dockWindowClosed(bool))); 

Dieser Schlitz hat aufgerufen - aber nicht, wenn die Schließen-Schaltfläche geklickt wurde.

Schließlich habe ich versucht, einen Promoter QDockWidget zu verwenden, um die QWidget::closeEvent() zu erfassen.

class DockWidgetWithCloseSignal : public QDockWidget 
    { 
     Q_OBJECT 
    public: 
     explicit DockWidgetWithCloseSignal(const QString &title, QWidget *parent = 0, Qt::WindowFlags flags = 0) 
     : QDockWidget(title, parent, flags) 
    { 

    } 

    explicit DockWidgetWithCloseSignal(QWidget *parent = 0, Qt::WindowFlags flags = 0) 
: QDockWidget(parent, flags) 
    { 

    } 
protected: 
    void closeEvent(QCloseEvent *event) 
    { 
     event->ignore(); 
    } 
}; 

sah ich den Konstruktor wurde aufgerufen, die diese neue Widget bedeutet in der Tat verwendet wurde, aber wieder keine Freude, da die closeEvent() nie, wenn die Schließen-Schaltfläche geklickt wurde, genannt.

Antwort

0

Stellt sich heraus, dass alles außer dem visibilityChanged Signal funktioniert!

Ich fügte ein Signal an die überschriebene closeEvent() Methode, die ich dann an jeden Steckplatz verbinden konnte ich wollte.

Das eigentliche Problem war, dass innerhalb der gestapelten Widget hatte ich eine andere QDockWidget auf einer anderen Seite, daher habe ich all diese Dinge zu den falschen QDockWidget hinzugefügt! (Und natürlich förderte die falsche QDockWidget auch doh!).

Hoffentlich kann diese Frage als Referenz für jeden anderen dienen, der herausfinden muss, wie man das macht - und nicht, warum es nicht funktioniert.

+0

Ich habe QObject :: destroy() -Signal wie in http://stackoverflow.com/questions/7091830/qt-destructor-call-for-closed-widget beschrieben verwendet – vrogach